diff --git a/include/spdk_internal/sock.h b/include/spdk_internal/sock.h index 1f4653b10..dae79f455 100644 --- a/include/spdk_internal/sock.h +++ b/include/spdk_internal/sock.h @@ -44,6 +44,7 @@ struct spdk_sock { uint8_t closed : 1; uint8_t reserved : 7; } flags; + struct spdk_sock_impl_opts impl_opts; }; struct spdk_sock_group { diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index c44184e5d..be148e881 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -298,7 +298,7 @@ posix_sock_set_recvbuf(struct spdk_sock *_sock, int sz) assert(sock != NULL); - if (g_spdk_posix_sock_impl_opts.enable_recv_pipe) { + if (_sock->impl_opts.enable_recv_pipe) { rc = posix_sock_alloc_pipe(sock, sz); if (rc) { return rc; @@ -315,6 +315,8 @@ posix_sock_set_recvbuf(struct spdk_sock *_sock, int sz) return rc; } + _sock->impl_opts.recv_buf_size = sz; + return 0; } @@ -335,6 +337,8 @@ posix_sock_set_sendbuf(struct spdk_sock *_sock, int sz) return rc; } + _sock->impl_opts.send_buf_size = sz; + return 0; } @@ -361,17 +365,17 @@ posix_sock_init(struct spdk_posix_sock *sock, bool enable_zero_copy) #if defined(__linux__) flag = 1; - if (g_spdk_posix_sock_impl_opts.enable_quickack) { + if (sock->base.impl_opts.enable_quickack) { rc = setsockopt(sock->fd, IPPROTO_TCP, TCP_QUICKACK, &flag, sizeof(flag)); if (rc != 0) { SPDK_ERRLOG("quickack was failed to set\n"); } } - spdk_sock_get_placement_id(sock->fd, g_spdk_posix_sock_impl_opts.enable_placement_id, + spdk_sock_get_placement_id(sock->fd, sock->base.impl_opts.enable_placement_id, &sock->placement_id); - if (g_spdk_posix_sock_impl_opts.enable_placement_id == PLACEMENT_MARK) { + if (sock->base.impl_opts.enable_placement_id == PLACEMENT_MARK) { /* Save placement_id */ spdk_sock_map_insert(&g_map, sock->placement_id, NULL); } @@ -379,7 +383,7 @@ posix_sock_init(struct spdk_posix_sock *sock, bool enable_zero_copy) } static struct spdk_posix_sock * -posix_sock_alloc(int fd, bool enable_zero_copy) +posix_sock_alloc(int fd, struct spdk_sock_impl_opts *impl_opts, bool enable_zero_copy) { struct spdk_posix_sock *sock; @@ -390,6 +394,7 @@ posix_sock_alloc(int fd, bool enable_zero_copy) } sock->fd = fd; + memcpy(&sock->base.impl_opts, impl_opts, sizeof(*impl_opts)); posix_sock_init(sock, enable_zero_copy); return sock; @@ -934,7 +939,8 @@ retry: /* Only enable zero copy for non-loopback and non-ssl sockets. */ enable_zcopy_user_opts = opts->zcopy && !sock_is_loopback(fd) && !enable_ssl; - sock = posix_sock_alloc(fd, enable_zcopy_user_opts && enable_zcopy_impl_opts); + sock = posix_sock_alloc(fd, &g_spdk_posix_sock_impl_opts, + enable_zcopy_user_opts && enable_zcopy_impl_opts); if (sock == NULL) { SPDK_ERRLOG("sock allocation failed\n"); close(fd); @@ -1018,7 +1024,7 @@ posix_sock_accept(struct spdk_sock *_sock) } /* Inherit the zero copy feature from the listen socket */ - new_sock = posix_sock_alloc(fd, sock->zcopy); + new_sock = posix_sock_alloc(fd, &sock->base.impl_opts, sock->zcopy); if (new_sock == NULL) { close(fd); return NULL; diff --git a/module/sock/uring/uring.c b/module/sock/uring/uring.c index f2788f82e..8fc216fb1 100644 --- a/module/sock/uring/uring.c +++ b/module/sock/uring/uring.c @@ -318,7 +318,7 @@ uring_sock_set_recvbuf(struct spdk_sock *_sock, int sz) assert(sock != NULL); - if (g_spdk_uring_sock_impl_opts.enable_recv_pipe) { + if (_sock->impl_opts.enable_recv_pipe) { rc = uring_sock_alloc_pipe(sock, sz); if (rc) { SPDK_ERRLOG("unable to allocate sufficient recvbuf with sz=%d on sock=%p\n", sz, _sock); @@ -335,6 +335,8 @@ uring_sock_set_recvbuf(struct spdk_sock *_sock, int sz) return rc; } + _sock->impl_opts.recv_buf_size = sz; + return 0; } @@ -355,11 +357,13 @@ uring_sock_set_sendbuf(struct spdk_sock *_sock, int sz) return rc; } + _sock->impl_opts.send_buf_size = sz; + return 0; } static struct spdk_uring_sock * -uring_sock_alloc(int fd, bool enable_zero_copy) +uring_sock_alloc(int fd, struct spdk_sock_impl_opts *impl_opts, bool enable_zero_copy) { struct spdk_uring_sock *sock; #if defined(__linux__) @@ -374,18 +378,19 @@ uring_sock_alloc(int fd, bool enable_zero_copy) } sock->fd = fd; + memcpy(&sock->base.impl_opts, impl_opts, sizeof(*impl_opts)); #if defined(__linux__) flag = 1; - if (g_spdk_uring_sock_impl_opts.enable_quickack) { + if (sock->base.impl_opts.enable_quickack) { rc = setsockopt(sock->fd, IPPROTO_TCP, TCP_QUICKACK, &flag, sizeof(flag)); if (rc != 0) { SPDK_ERRLOG("quickack was failed to set\n"); } } - spdk_sock_get_placement_id(sock->fd, g_spdk_uring_sock_impl_opts.enable_placement_id, + spdk_sock_get_placement_id(sock->fd, sock->base.impl_opts.enable_placement_id, &sock->placement_id); #ifdef SPDK_ZEROCOPY /* Try to turn on zero copy sends */ @@ -591,7 +596,8 @@ retry: } enable_zcopy_user_opts = opts->zcopy && !sock_is_loopback(fd); - sock = uring_sock_alloc(fd, enable_zcopy_user_opts && enable_zcopy_impl_opts); + sock = uring_sock_alloc(fd, &g_spdk_uring_sock_impl_opts, + enable_zcopy_user_opts && enable_zcopy_impl_opts); if (sock == NULL) { SPDK_ERRLOG("sock allocation failed\n"); close(fd); @@ -654,7 +660,7 @@ uring_sock_accept(struct spdk_sock *_sock) } #endif - new_sock = uring_sock_alloc(fd, sock->zcopy); + new_sock = uring_sock_alloc(fd, &sock->base.impl_opts, sock->zcopy); if (new_sock == NULL) { close(fd); return NULL;