X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fcompat-epoll.c;h=9055f51291475ae31b9508f7197d3eb581d2cc89;hp=dbaf6823364eb5e4444ba536ac0291300a527a0a;hb=4fb28dfc10106c4095ca3b1155d4da9a04467fd1;hpb=f057dfc322670467e14c661d625cec0747ce8a31 diff --git a/src/common/compat/compat-epoll.c b/src/common/compat/compat-epoll.c index dbaf68233..9055f5129 100644 --- a/src/common/compat/compat-epoll.c +++ b/src/common/compat/compat-epoll.c @@ -1,18 +1,8 @@ /* - * Copyright (C) 2011 - David Goulet + * Copyright (C) 2011 David Goulet * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE @@ -23,6 +13,7 @@ #include #include #include +#include #include #include @@ -31,7 +22,17 @@ #include "poll.h" -unsigned int poll_max_size; +/* + * Maximum number of fd we can monitor. + * + * For epoll(7), /proc/sys/fs/epoll/max_user_watches (since Linux 2.6.28) will + * be used for the maximum size of the poll set. If this interface is not + * available, according to the manpage, the max_user_watches value is 1/25 (4%) + * of the available low memory divided by the registration cost in bytes which + * is 90 bytes on a 32-bit kernel and 160 bytes on a 64-bit kernel. + * + */ +static unsigned int poll_max_size; /* * Resize the epoll events structure of the new size. @@ -67,6 +68,7 @@ error: /* * Create epoll set and allocate returned events structure. */ +LTTNG_HIDDEN int compat_epoll_create(struct lttng_poll_event *events, int size, int flags) { int ret; @@ -119,6 +121,7 @@ error: /* * Add a fd to the epoll set with requesting events. */ +LTTNG_HIDDEN int compat_epoll_add(struct lttng_poll_event *events, int fd, uint32_t req_events) { int ret; @@ -166,6 +169,7 @@ error: /* * Remove a fd from the epoll set. */ +LTTNG_HIDDEN int compat_epoll_del(struct lttng_poll_event *events, int fd) { int ret; @@ -200,6 +204,7 @@ error: /* * Set an fd's events. */ +LTTNG_HIDDEN int compat_epoll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events) { int ret; @@ -241,7 +246,9 @@ error: /* * Wait on epoll set. This is a blocking call of timeout value. */ -int compat_epoll_wait(struct lttng_poll_event *events, int timeout) +LTTNG_HIDDEN +int compat_epoll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible) { int ret; uint32_t new_size; @@ -273,10 +280,11 @@ int compat_epoll_wait(struct lttng_poll_event *events, int timeout) do { ret = epoll_wait(events->epfd, events->events, events->nb_fd, timeout); - } while (ret == -1 && errno == EINTR); + } while (!interruptible && ret == -1 && errno == EINTR); if (ret < 0) { - /* At this point, every error is fatal */ - PERROR("epoll_wait"); + if (errno != EINTR) { + PERROR("epoll_wait"); + } goto error; } @@ -293,6 +301,7 @@ error: /* * Setup poll set maximum size. */ +LTTNG_HIDDEN int compat_epoll_set_max_size(void) { int ret, fd, retval = 0; @@ -301,7 +310,15 @@ int compat_epoll_set_max_size(void) fd = open(COMPAT_EPOLL_PROC_PATH, O_RDONLY); if (fd < 0) { - retval = -1; + /* + * Failing on opening [1] is not an error per see. [1] was + * introduced in Linux 2.6.28 but epoll is available since + * 2.5.44. Hence, goto end and set a default value without + * setting an error return value. + * + * [1] /proc/sys/fs/epoll/max_user_watches + */ + retval = 0; goto end; }