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:
parent
22058d70fc
commit
2d877401fd
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user