Commit 2d877401 authored by Sudheer Mogilappagari's avatar Sudheer Mogilappagari Committed by Tomasz Zawadzki
Browse files

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: default avatarSudheer Mogilappagari <sudheer.mogilappagari@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3180


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 22058d70
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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++) {