diff --git a/include/spdk/sock.h b/include/spdk/sock.h index 6677cf8ed..81bd823d4 100644 --- a/include/spdk/sock.h +++ b/include/spdk/sock.h @@ -83,12 +83,12 @@ enum spdk_placement_mode { */ struct spdk_sock_impl_opts { /** - * Size of sock receive buffer. Used by posix and uring socket modules. + * Minimum size of sock receive buffer. Used by posix and uring socket modules. */ uint32_t recv_buf_size; /** - * Size of sock send buffer. Used by posix and uring socket modules. + * Minimum size of sock send buffer. Used by posix and uring socket modules. */ uint32_t send_buf_size; diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index 934a33b27..435ebf699 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -317,6 +317,7 @@ static int posix_sock_set_recvbuf(struct spdk_sock *_sock, int sz) { struct spdk_posix_sock *sock = __posix_sock(_sock); + int min_size; int rc; assert(sock != NULL); @@ -328,9 +329,12 @@ posix_sock_set_recvbuf(struct spdk_sock *_sock, int sz) } } - /* Set kernel buffer size to be at least MIN_SO_RCVBUF_SIZE */ - if (sz < MIN_SO_RCVBUF_SIZE) { - sz = MIN_SO_RCVBUF_SIZE; + /* Set kernel buffer size to be at least MIN_SO_RCVBUF_SIZE and + * g_spdk_posix_sock_impl_opts.recv_buf_size. */ + min_size = spdk_max(MIN_SO_RCVBUF_SIZE, g_spdk_posix_sock_impl_opts.recv_buf_size); + + if (sz < min_size) { + sz = min_size; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)); @@ -347,12 +351,17 @@ static int posix_sock_set_sendbuf(struct spdk_sock *_sock, int sz) { struct spdk_posix_sock *sock = __posix_sock(_sock); + int min_size; int rc; assert(sock != NULL); - if (sz < MIN_SO_SNDBUF_SIZE) { - sz = MIN_SO_SNDBUF_SIZE; + /* Set kernel buffer size to be at least MIN_SO_SNDBUF_SIZE and + * g_spdk_posix_sock_impl_opts.send_buf_size. */ + min_size = spdk_max(MIN_SO_SNDBUF_SIZE, g_spdk_posix_sock_impl_opts.send_buf_size); + + if (sz < min_size) { + sz = min_size; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)); diff --git a/module/sock/uring/uring.c b/module/sock/uring/uring.c index 5a43873d0..a82dd1a05 100644 --- a/module/sock/uring/uring.c +++ b/module/sock/uring/uring.c @@ -337,6 +337,7 @@ static int uring_sock_set_recvbuf(struct spdk_sock *_sock, int sz) { struct spdk_uring_sock *sock = __uring_sock(_sock); + int min_size; int rc; assert(sock != NULL); @@ -349,8 +350,12 @@ uring_sock_set_recvbuf(struct spdk_sock *_sock, int sz) } } - if (sz < MIN_SO_RCVBUF_SIZE) { - sz = MIN_SO_RCVBUF_SIZE; + /* Set kernel buffer size to be at least MIN_SO_RCVBUF_SIZE and + * g_spdk_uring_sock_impl_opts.recv_buf_size. */ + min_size = spdk_max(MIN_SO_RCVBUF_SIZE, g_spdk_uring_sock_impl_opts.recv_buf_size); + + if (sz < min_size) { + sz = min_size; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz)); @@ -367,12 +372,17 @@ static int uring_sock_set_sendbuf(struct spdk_sock *_sock, int sz) { struct spdk_uring_sock *sock = __uring_sock(_sock); + int min_size; int rc; assert(sock != NULL); - if (sz < MIN_SO_SNDBUF_SIZE) { - sz = MIN_SO_SNDBUF_SIZE; + /* Set kernel buffer size to be at least MIN_SO_SNDBUF_SIZE and + * g_spdk_uring_sock_impl_opts.seend_buf_size. */ + min_size = spdk_max(MIN_SO_SNDBUF_SIZE, g_spdk_uring_sock_impl_opts.send_buf_size); + + if (sz < min_size) { + sz = min_size; } rc = setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz));