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 <sudheer.mogilappagari@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3180
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:
Sudheer Mogilappagari 2020-07-02 07:43:27 -08:00 committed by Tomasz Zawadzki
parent 22058d70fc
commit 2d877401fd

View File

@ -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++) {