From a1ae47f34f7b7bcf16d45884f10c329d73d2a0d2 Mon Sep 17 00:00:00 2001 From: Nick Connolly Date: Thu, 18 Feb 2021 18:17:34 +0000 Subject: [PATCH] module/sock/posix: improve portability Default to using epoll unless __FreeBSD__ is defined. Add macros SPDK_KEVENT and SPDK_EPOLL to indicate whether epoll or kevent is present. The macros match the naming convention for SPDK_ZEROCOPY which controls zero copy in a similar way. Signed-off-by: Nick Connolly Change-Id: I4c46fb94b254cb075427bfe07a8085887254c45a Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6466 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- module/sock/posix/posix.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index 497919b50..5ef91871f 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -33,11 +33,16 @@ #include "spdk/stdinc.h" -#if defined(__linux__) -#include -#include -#elif defined(__FreeBSD__) +#if defined(__FreeBSD__) #include +#define SPDK_KEVENT +#else +#include +#define SPDK_EPOLL +#endif + +#if defined(__linux__) +#include #endif #include "spdk/log.h" @@ -1106,9 +1111,9 @@ posix_sock_group_impl_create(void) struct spdk_posix_sock_group_impl *group_impl; int fd; -#if defined(__linux__) +#if defined(SPDK_EPOLL) fd = epoll_create1(0); -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) fd = kqueue(); #endif if (fd == -1) { @@ -1135,7 +1140,7 @@ posix_sock_group_impl_add_sock(struct spdk_sock_group_impl *_group, struct spdk_ struct spdk_posix_sock *sock = __posix_sock(_sock); int rc; -#if defined(__linux__) +#if defined(SPDK_EPOLL) struct epoll_event event; memset(&event, 0, sizeof(event)); @@ -1144,7 +1149,7 @@ posix_sock_group_impl_add_sock(struct spdk_sock_group_impl *_group, struct spdk_ event.data.ptr = sock; rc = epoll_ctl(group->fd, EPOLL_CTL_ADD, sock->fd, &event); -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) struct kevent event; struct timespec ts = {0}; @@ -1179,12 +1184,12 @@ posix_sock_group_impl_remove_sock(struct spdk_sock_group_impl *_group, struct sp assert(sock->pending_recv == false); } -#if defined(__linux__) +#if defined(SPDK_EPOLL) struct epoll_event event; /* Event parameter is ignored but some old kernel version still require it. */ rc = epoll_ctl(group->fd, EPOLL_CTL_DEL, sock->fd, &event); -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) struct kevent event; struct timespec ts = {0}; @@ -1210,9 +1215,9 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, struct spdk_sock *sock, *tmp; int num_events, i, rc; struct spdk_posix_sock *psock, *ptmp; -#if defined(__linux__) +#if defined(SPDK_EPOLL) struct epoll_event events[MAX_EVENTS_PER_POLL]; -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) struct kevent events[MAX_EVENTS_PER_POLL]; struct timespec ts = {0}; #endif @@ -1227,9 +1232,9 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, } } -#if defined(__linux__) +#if defined(SPDK_EPOLL) num_events = epoll_wait(group->fd, events, max_events, 0); -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) num_events = kevent(group->fd, NULL, 0, events, max_events, &ts); #endif @@ -1249,7 +1254,7 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, } for (i = 0; i < num_events; i++) { -#if defined(__linux__) +#if defined(SPDK_EPOLL) sock = events[i].data.ptr; psock = __posix_sock(sock); @@ -1268,7 +1273,7 @@ posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, continue; } -#elif defined(__FreeBSD__) +#elif defined(SPDK_KEVENT) sock = events[i].udata; psock = __posix_sock(sock); #endif