From 2d877401fde7182c29b27de579e7218b41d98727 Mon Sep 17 00:00:00 2001 From: Sudheer Mogilappagari Date: Thu, 2 Jul 2020 07:43:27 -0800 Subject: [PATCH] nvmf/tcp: Add recv to busy poll hw queue for data Call recv to trigger busy polling even when no socket is active. when epoll_wait returns zero, the first socket in poll group is used to trigger busy polling in kernel stack and potentially reap incoming data Change-Id: I15f04cb4a2c7b382dd07391eda69678fd7919790 Signed-off-by: Sudheer Mogilappagari Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3180 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto --- module/sock/posix/posix.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index 7057cbfc7..048a8bae8 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -68,6 +68,7 @@ struct spdk_posix_sock { void *recv_buf; int recv_buf_sz; bool pending_recv; + int so_priority; TAILQ_ENTRY(spdk_posix_sock) link; }; @@ -552,6 +553,9 @@ retry: return NULL; } + if (opts != NULL) { + sock->so_priority = opts->priority; + } return &sock->base; } @@ -614,6 +618,7 @@ posix_sock_accept(struct spdk_sock *_sock) close(fd); return NULL; } + new_sock->so_priority = sock->base.opts.priority; return &new_sock->base; } @@ -1225,6 +1230,17 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, if (num_events == -1) { return -1; + } else if (num_events == 0 && !TAILQ_EMPTY(&_group->socks)) { + uint8_t byte; + + sock = TAILQ_FIRST(&_group->socks); + psock = __posix_sock(sock); + /* a recv is done here to busy poll the queue associated with + * first socket in list and potentially reap incoming data. + */ + if (psock->so_priority) { + recv(psock->fd, &byte, 1, MSG_PEEK); + } } for (i = 0; i < num_events; i++) {