From 8b0e9fb17edab249f41391d877d8d03961f4f7ee Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Wed, 17 Jan 2018 13:42:26 -0800 Subject: Explicitly enable epoll on manylinux1 For some reason, the glibc version check does not enable GRPC_LINUX_EPOLL on manylinux1. This commit: * Explicitly enables GRPC_LINUX_LEGACY_EPOLL on MANYLINUX1 * Switches the flag to enable epoll1 IO manager to GRPC_LINUX_LEGACY_EPOLL instead of GRPC_LINUX_EPOLL. This is to ensure epollex and epollsig that are not yet compatible with epoll_create (not epoll_create1) do not get activated unintentionally. --- src/core/lib/iomgr/ev_epoll1_linux.cc | 27 ++++++++++++--------------- src/core/lib/iomgr/port.h | 4 +++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/core/lib/iomgr/ev_epoll1_linux.cc b/src/core/lib/iomgr/ev_epoll1_linux.cc index 6ec25d761f..c8899be985 100644 --- a/src/core/lib/iomgr/ev_epoll1_linux.cc +++ b/src/core/lib/iomgr/ev_epoll1_linux.cc @@ -20,8 +20,9 @@ #include -/* This polling engine is only relevant on linux kernels supporting epoll() */ -#ifdef GRPC_LINUX_EPOLL +/* This polling engine is only relevant on linux kernels supporting epoll + epoll_create() or epoll_create1() */ +#ifdef GRPC_LINUX_LEGACY_EPOLL #include "src/core/lib/iomgr/ev_epoll1_linux.h" #include @@ -85,31 +86,27 @@ typedef struct epoll_set { /* The global singleton epoll set */ static epoll_set g_epoll_set; -static int epoll_create_and_set_flag() { +static int epoll_create_and_cloexec() { #ifdef GRPC_LINUX_EPOLL_CREATE1 int fd = epoll_create1(EPOLL_CLOEXEC); - if (fd >= 0) { - return fd; + if (fd < 0) { + gpr_log(GPR_ERROR, "epoll_create1 unavailable"); } - gpr_log(GPR_ERROR, "epoll_create1 unavailable"); - return -1; #else int fd = epoll_create(MAX_EPOLL_EVENTS); if (fd < 0) { gpr_log(GPR_ERROR, "epoll_create unavailable"); + } else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + gpr_log(GPR_ERROR, "fcntl following epoll_create failed"); return -1; } - if (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) { - return fd; - } - gpr_log(GPR_ERROR, "fcntl following epoll_create failed"); - return -1; #endif + return fd; } /* Must be called *only* once */ static bool epoll_set_init() { - g_epoll_set.epfd = epoll_create_and_set_flag(); + g_epoll_set.epfd = epoll_create_and_cloexec(); if (g_epoll_set.epfd < 0) { return false; } @@ -1248,7 +1245,7 @@ const grpc_event_engine_vtable* grpc_init_epoll1_linux(bool explicit_request) { return &vtable; } -#else /* defined(GRPC_LINUX_EPOLL) */ +#else /* defined(GRPC_LINUX_LEGACY_EPOLL) */ #if defined(GRPC_POSIX_SOCKET) #include "src/core/lib/iomgr/ev_epoll1_linux.h" /* If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return @@ -1257,4 +1254,4 @@ const grpc_event_engine_vtable* grpc_init_epoll1_linux(bool explicit_request) { return nullptr; } #endif /* defined(GRPC_POSIX_SOCKET) */ -#endif /* !defined(GRPC_LINUX_EPOLL) */ +#endif /* !defined(GRPC_LINUX_LEGACY_EPOLL) */ diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h index 80867ee09f..2d56ded4e2 100644 --- a/src/core/lib/iomgr/port.h +++ b/src/core/lib/iomgr/port.h @@ -37,6 +37,7 @@ #define GRPC_POSIX_SOCKETUTILS 1 #define GRPC_POSIX_WAKEUP_FD 1 #define GRPC_TIMER_USE_GENERIC 1 +#define GRPC_LINUX_LEGACY_EPOLL 1 #elif defined(GPR_WINDOWS) #define GRPC_TIMER_USE_GENERIC 1 #define GRPC_WINSOCK_SOCKET 1 @@ -68,9 +69,10 @@ #define GRPC_TIMER_USE_GENERIC 1 #ifdef __GLIBC_PREREQ #if __GLIBC_PREREQ(2, 4) -#define GRPC_LINUX_EPOLL 1 +#define GRPC_LINUX_LEGACY_EPOLL 1 #endif #if __GLIBC_PREREQ(2, 9) +#define GRPC_LINUX_EPOLL 1 #define GRPC_LINUX_EPOLL_CREATE1 1 #define GRPC_LINUX_EVENTFD 1 #endif -- cgit v1.2.3