From 74b184e73aaff0dbf6cec7749d05658c4672aeae Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Wed, 29 Jan 2020 11:39:59 +0000 Subject: [PATCH] sock/posix: Add recv_buf_size and send_buf_size socket layer options Signed-off-by: Evgeniy Kochetov Change-Id: Ifb7d542c4da83070344c4baa512da459ba73ec90 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/610 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto --- CHANGELOG.md | 2 ++ include/spdk/sock.h | 12 +++++++++++- module/sock/posix/posix.c | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb03866ad..1dc355583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ Using mlx5_dv requires libmlx5 installed on the system. Added `spdk_sock_impl_get_opts` and `spdk_sock_impl_set_opts` functions to set/get socket layer configuration options. Options can be set independently for each implementation. +Added `recv_buf_size` and 'send_buf_size' socket layer options. They are used only in posix implementation. + ## v20.04: IDXD engine support for compare has been added. diff --git a/include/spdk/sock.h b/include/spdk/sock.h index a95743d38..0acdd4f59 100644 --- a/include/spdk/sock.h +++ b/include/spdk/sock.h @@ -86,7 +86,17 @@ struct spdk_sock_request { * to allow the user to request options for the socket module implementation. * Each socket module defines which options from this structure are applicable to the module. */ -struct spdk_sock_impl_opts; +struct spdk_sock_impl_opts { + /** + * Size of sock receive buffer. Used by posix socket module. + */ + uint32_t recv_buf_size; + + /** + * Size of sock send buffer. Used by posix socket module. + */ + uint32_t send_buf_size; +}; /** * Spdk socket initialization options. diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index cdc3e4aa3..c82aa0af3 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -49,8 +49,8 @@ #define MAX_TMPBUF 1024 #define PORTNUMLEN 32 -#define SO_RCVBUF_SIZE (2 * 1024 * 1024) -#define SO_SNDBUF_SIZE (2 * 1024 * 1024) +#define MIN_SO_RCVBUF_SIZE (2 * 1024 * 1024) +#define MIN_SO_SNDBUF_SIZE (2 * 1024 * 1024) #define IOV_BATCH_SIZE 64 #if defined(SO_ZEROCOPY) && defined(MSG_ZEROCOPY) @@ -78,6 +78,11 @@ struct spdk_posix_sock_group_impl { TAILQ_HEAD(, spdk_posix_sock) pending_recv; }; +static struct spdk_sock_impl_opts g_spdk_posix_sock_impl_opts = { + .recv_buf_size = MIN_SO_RCVBUF_SIZE, + .send_buf_size = MIN_SO_SNDBUF_SIZE +}; + static int get_addr_str(struct sockaddr *sa, char *host, size_t hlen) { @@ -263,9 +268,9 @@ posix_sock_set_recvbuf(struct spdk_sock *_sock, int sz) return rc; } - /* Set kernel buffer size to be at least SO_RCVBUF_SIZE */ - if (sz < SO_RCVBUF_SIZE) { - sz = SO_RCVBUF_SIZE; + /* Set kernel buffer size to be at least MIN_SO_RCVBUF_SIZE */ + if (sz < MIN_SO_RCVBUF_SIZE) { + sz = MIN_SO_RCVBUF_SIZE; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)); @@ -284,8 +289,8 @@ posix_sock_set_sendbuf(struct spdk_sock *_sock, int sz) assert(sock != NULL); - if (sz < SO_SNDBUF_SIZE) { - sz = SO_SNDBUF_SIZE; + if (sz < MIN_SO_SNDBUF_SIZE) { + sz = MIN_SO_SNDBUF_SIZE; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)); @@ -428,13 +433,13 @@ retry: continue; } - sz = SO_RCVBUF_SIZE; + sz = g_spdk_posix_sock_impl_opts.recv_buf_size; rc = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)); if (rc) { /* Not fatal */ } - sz = SO_SNDBUF_SIZE; + sz = g_spdk_posix_sock_impl_opts.send_buf_size; rc = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)); if (rc) { /* Not fatal */ @@ -1301,9 +1306,16 @@ posix_sock_impl_get_opts(struct spdk_sock_impl_opts *opts, size_t *len) #define FIELD_OK(field) \ offsetof(struct spdk_sock_impl_opts, field) + sizeof(opts->field) <= *len + if (FIELD_OK(recv_buf_size)) { + opts->recv_buf_size = g_spdk_posix_sock_impl_opts.recv_buf_size; + } + if (FIELD_OK(send_buf_size)) { + opts->send_buf_size = g_spdk_posix_sock_impl_opts.send_buf_size; + } + #undef FIELD_OK - *len = 0; + *len = spdk_min(*len, sizeof(g_spdk_posix_sock_impl_opts)); return 0; } @@ -1318,6 +1330,13 @@ posix_sock_impl_set_opts(const struct spdk_sock_impl_opts *opts, size_t len) #define FIELD_OK(field) \ offsetof(struct spdk_sock_impl_opts, field) + sizeof(opts->field) <= len + if (FIELD_OK(recv_buf_size)) { + g_spdk_posix_sock_impl_opts.recv_buf_size = opts->recv_buf_size; + } + if (FIELD_OK(send_buf_size)) { + g_spdk_posix_sock_impl_opts.send_buf_size = opts->send_buf_size; + } + #undef FIELD_OK return 0;