sock/posix: Add recv_buf_size and send_buf_size socket layer options
Signed-off-by: Evgeniy Kochetov <evgeniik@mellanox.com> Change-Id: Ifb7d542c4da83070344c4baa512da459ba73ec90 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/610 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
bc157de238
commit
74b184e73a
@ -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
|
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.
|
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:
|
## v20.04:
|
||||||
|
|
||||||
IDXD engine support for compare has been added.
|
IDXD engine support for compare has been added.
|
||||||
|
@ -86,7 +86,17 @@ struct spdk_sock_request {
|
|||||||
* to allow the user to request options for the socket module implementation.
|
* 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.
|
* 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.
|
* Spdk socket initialization options.
|
||||||
|
@ -49,8 +49,8 @@
|
|||||||
|
|
||||||
#define MAX_TMPBUF 1024
|
#define MAX_TMPBUF 1024
|
||||||
#define PORTNUMLEN 32
|
#define PORTNUMLEN 32
|
||||||
#define SO_RCVBUF_SIZE (2 * 1024 * 1024)
|
#define MIN_SO_RCVBUF_SIZE (2 * 1024 * 1024)
|
||||||
#define SO_SNDBUF_SIZE (2 * 1024 * 1024)
|
#define MIN_SO_SNDBUF_SIZE (2 * 1024 * 1024)
|
||||||
#define IOV_BATCH_SIZE 64
|
#define IOV_BATCH_SIZE 64
|
||||||
|
|
||||||
#if defined(SO_ZEROCOPY) && defined(MSG_ZEROCOPY)
|
#if defined(SO_ZEROCOPY) && defined(MSG_ZEROCOPY)
|
||||||
@ -78,6 +78,11 @@ struct spdk_posix_sock_group_impl {
|
|||||||
TAILQ_HEAD(, spdk_posix_sock) pending_recv;
|
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
|
static int
|
||||||
get_addr_str(struct sockaddr *sa, char *host, size_t hlen)
|
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;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set kernel buffer size to be at least SO_RCVBUF_SIZE */
|
/* Set kernel buffer size to be at least MIN_SO_RCVBUF_SIZE */
|
||||||
if (sz < SO_RCVBUF_SIZE) {
|
if (sz < MIN_SO_RCVBUF_SIZE) {
|
||||||
sz = SO_RCVBUF_SIZE;
|
sz = MIN_SO_RCVBUF_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz));
|
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);
|
assert(sock != NULL);
|
||||||
|
|
||||||
if (sz < SO_SNDBUF_SIZE) {
|
if (sz < MIN_SO_SNDBUF_SIZE) {
|
||||||
sz = SO_SNDBUF_SIZE;
|
sz = MIN_SO_SNDBUF_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz));
|
rc = setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz));
|
||||||
@ -428,13 +433,13 @@ retry:
|
|||||||
continue;
|
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));
|
rc = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz));
|
||||||
if (rc) {
|
if (rc) {
|
||||||
/* Not fatal */
|
/* 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));
|
rc = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz));
|
||||||
if (rc) {
|
if (rc) {
|
||||||
/* Not fatal */
|
/* Not fatal */
|
||||||
@ -1301,9 +1306,16 @@ posix_sock_impl_get_opts(struct spdk_sock_impl_opts *opts, size_t *len)
|
|||||||
#define FIELD_OK(field) \
|
#define FIELD_OK(field) \
|
||||||
offsetof(struct spdk_sock_impl_opts, field) + sizeof(opts->field) <= *len
|
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
|
#undef FIELD_OK
|
||||||
|
|
||||||
*len = 0;
|
*len = spdk_min(*len, sizeof(g_spdk_posix_sock_impl_opts));
|
||||||
return 0;
|
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) \
|
#define FIELD_OK(field) \
|
||||||
offsetof(struct spdk_sock_impl_opts, field) + sizeof(opts->field) <= len
|
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
|
#undef FIELD_OK
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user