Commit 74b184e7 authored by Evgeniy Kochetov's avatar Evgeniy Kochetov Committed by Tomasz Zawadzki
Browse files

sock/posix: Add recv_buf_size and send_buf_size socket layer options



Signed-off-by: default avatarEvgeniy 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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent bc157de2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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.
+11 −1
Original line number Diff line number Diff line
@@ -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.
+29 −10
Original line number Diff line number Diff line
@@ -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;