Skip to content

Commit

Permalink
libceph: tcp_nodelay support
Browse files Browse the repository at this point in the history
TCP_NODELAY socket option set on connection sockets,
disables Nagle’s algorithm and improves latency characteristics.
tcp_nodelay(default)/notcp_nodelay option flags provided to
enable/disable setting the socket option.

Signed-off-by: Chaitanya Huilgol <chaitanya.huilgol@sandisk.com>
[idryomov@redhat.com: NO_TCP_NODELAY -> TCP_NODELAY, minor adjustments]
Signed-off-by: Ilya Dryomov <idryomov@redhat.com>
  • Loading branch information
Chaitanya Huilgol authored and Ilya Dryomov committed Feb 19, 2015
1 parent cf32bd9 commit ba988f8
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 4 deletions.
3 changes: 2 additions & 1 deletion include/linux/ceph/libceph.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
#define CEPH_OPT_MYIP (1<<2) /* specified my ip */
#define CEPH_OPT_NOCRC (1<<3) /* no data crc on writes */
#define CEPH_OPT_NOMSGAUTH (1<<4) /* not require cephx message signature */
#define CEPH_OPT_TCP_NODELAY (1<<5) /* TCP_NODELAY on TCP sockets */

#define CEPH_OPT_DEFAULT (0)
#define CEPH_OPT_DEFAULT (CEPH_OPT_TCP_NODELAY)

#define ceph_set_opt(client, opt) \
(client)->options->flags |= CEPH_OPT_##opt;
Expand Down
4 changes: 3 additions & 1 deletion include/linux/ceph/messenger.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ struct ceph_messenger {

atomic_t stopping;
bool nocrc;
bool tcp_nodelay;

/*
* the global_seq counts connections i (attempt to) initiate
Expand Down Expand Up @@ -264,7 +265,8 @@ extern void ceph_messenger_init(struct ceph_messenger *msgr,
struct ceph_entity_addr *myaddr,
u64 supported_features,
u64 required_features,
bool nocrc);
bool nocrc,
bool tcp_nodelay);

extern void ceph_con_init(struct ceph_connection *con, void *private,
const struct ceph_connection_operations *ops,
Expand Down
16 changes: 15 additions & 1 deletion net/ceph/ceph_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,8 @@ enum {
Opt_nocrc,
Opt_cephx_require_signatures,
Opt_nocephx_require_signatures,
Opt_tcp_nodelay,
Opt_notcp_nodelay,
};

static match_table_t opt_tokens = {
Expand All @@ -259,6 +261,8 @@ static match_table_t opt_tokens = {
{Opt_nocrc, "nocrc"},
{Opt_cephx_require_signatures, "cephx_require_signatures"},
{Opt_nocephx_require_signatures, "nocephx_require_signatures"},
{Opt_tcp_nodelay, "tcp_nodelay"},
{Opt_notcp_nodelay, "notcp_nodelay"},
{-1, NULL}
};

Expand Down Expand Up @@ -457,13 +461,21 @@ ceph_parse_options(char *options, const char *dev_name,
case Opt_nocrc:
opt->flags |= CEPH_OPT_NOCRC;
break;

case Opt_cephx_require_signatures:
opt->flags &= ~CEPH_OPT_NOMSGAUTH;
break;
case Opt_nocephx_require_signatures:
opt->flags |= CEPH_OPT_NOMSGAUTH;
break;

case Opt_tcp_nodelay:
opt->flags |= CEPH_OPT_TCP_NODELAY;
break;
case Opt_notcp_nodelay:
opt->flags &= ~CEPH_OPT_TCP_NODELAY;
break;

default:
BUG_ON(token);
}
Expand Down Expand Up @@ -518,10 +530,12 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
/* msgr */
if (ceph_test_opt(client, MYIP))
myaddr = &client->options->my_addr;

ceph_messenger_init(&client->msgr, myaddr,
client->supported_features,
client->required_features,
ceph_test_opt(client, NOCRC));
ceph_test_opt(client, NOCRC),
ceph_test_opt(client, TCP_NODELAY));

/* subsystems */
err = ceph_monc_init(&client->monc, client);
Expand Down
14 changes: 13 additions & 1 deletion net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,16 @@ static int ceph_tcp_connect(struct ceph_connection *con)
return ret;
}

if (con->msgr->tcp_nodelay) {
int optval = 1;

ret = kernel_setsockopt(sock, SOL_TCP, TCP_NODELAY,
(char *)&optval, sizeof(optval));
if (ret)
pr_err("kernel_setsockopt(TCP_NODELAY) failed: %d",
ret);
}

sk_set_memalloc(sock->sk);

con->sock = sock;
Expand Down Expand Up @@ -2922,7 +2932,8 @@ void ceph_messenger_init(struct ceph_messenger *msgr,
struct ceph_entity_addr *myaddr,
u64 supported_features,
u64 required_features,
bool nocrc)
bool nocrc,
bool tcp_nodelay)
{
msgr->supported_features = supported_features;
msgr->required_features = required_features;
Expand All @@ -2937,6 +2948,7 @@ void ceph_messenger_init(struct ceph_messenger *msgr,
get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce));
encode_my_addr(msgr);
msgr->nocrc = nocrc;
msgr->tcp_nodelay = tcp_nodelay;

atomic_set(&msgr->stopping, 0);

Expand Down

0 comments on commit ba988f8

Please sign in to comment.