[PATCH v2 1/1] Linux: Add epoll ioctls

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed May 29 14:14:32 GMT 2024



On 28/05/24 14:37, Joe Damato wrote:
> As of Linux kernel 6.9, some ioctls and a parameters structure have been
> introduced which allow user programs to control whether a particular
> epoll context will busy poll.
> 
> Update the headers to include these for the convenience of user apps.
> 
> The ioctls were added in Linux kernel 6.9 commit 18e2bf0edf4dd
> ("eventpoll: Add epoll ioctl for epoll_params") [1] to
> include/uapi/linux/eventpoll.h.
> 
> [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/diff/?h=v6.9&id=18e2bf0edf4dd
> 
> Signed-off-by: Joe Damato <jdamato@fastly.com>

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  NEWS                                       |  3 +
>  sysdeps/unix/sysv/linux/Makefile           |  1 +
>  sysdeps/unix/sysv/linux/sys/epoll.h        | 14 ++++
>  sysdeps/unix/sysv/linux/tst-epoll-ioctls.c | 92 ++++++++++++++++++++++
>  4 files changed, 110 insertions(+)
>  create mode 100644 sysdeps/unix/sysv/linux/tst-epoll-ioctls.c
> 
> diff --git a/NEWS b/NEWS
> index 84efa46df3..20e263f581 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -33,6 +33,9 @@ Major new features:
>    more extensive verification tests for AT_SECURE programs and not meant to
>    be a security feature.
>  
> +* On Linux, update epoll header to include epoll ioctl definitions and
> +  related structure added in Linux kernel 6.9.
> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * Architectures which use a 32-bit seconds-since-epoch field in struct
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 415aa1f14d..ae66590e91 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -200,6 +200,7 @@ tests += \
>    tst-clone2 \
>    tst-clone3 \
>    tst-epoll \
> +  tst-epoll-ioctls \
>    tst-fanotify \
>    tst-fdopendir-o_path \
>    tst-getauxval \
> diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h
> index fc8dce45c8..45e546fa44 100644
> --- a/sysdeps/unix/sysv/linux/sys/epoll.h
> +++ b/sysdeps/unix/sysv/linux/sys/epoll.h
> @@ -19,6 +19,7 @@
>  #define	_SYS_EPOLL_H	1
>  
>  #include <stdint.h>
> +#include <sys/ioctl.h>
>  #include <sys/types.h>
>  
>  #include <bits/types/sigset_t.h>
> @@ -87,6 +88,19 @@ struct epoll_event
>    epoll_data_t data;	/* User data variable */
>  } __EPOLL_PACKED;
>  
> +struct epoll_params
> +{
> +  uint32_t busy_poll_usecs;
> +  uint16_t busy_poll_budget;
> +  uint8_t prefer_busy_poll;
> +
> +  /* pad the struct to a multiple of 64bits */
> +  uint8_t __pad;
> +};
> +
> +#define EPOLL_IOC_TYPE 0x8A
> +#define EPIOCSPARAMS _IOW(EPOLL_IOC_TYPE, 0x01, struct epoll_params)
> +#define EPIOCGPARAMS _IOR(EPOLL_IOC_TYPE, 0x02, struct epoll_params)
>  
>  __BEGIN_DECLS
>  
> diff --git a/sysdeps/unix/sysv/linux/tst-epoll-ioctls.c b/sysdeps/unix/sysv/linux/tst-epoll-ioctls.c
> new file mode 100644
> index 0000000000..618ecc4e86
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-epoll-ioctls.c
> @@ -0,0 +1,92 @@
> +/* Basic tests for Linux epoll ioctls.
> +   Copyright (C) 2022-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library 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
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <intprops.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <support/check.h>
> +#include <support/process_state.h>
> +#include <support/support.h>
> +#include <support/test-driver.h>
> +#include <support/xsignal.h>
> +#include <support/xunistd.h>
> +#include <sys/ioctl.h>
> +#include <sys/epoll.h>
> +
> +static void
> +test_epoll_ioctl (void)
> +{
> +  int efd = epoll_create1 (0);
> +  TEST_VERIFY_EXIT (efd != -1);
> +
> +  struct epoll_params params;
> +
> +  TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, &params), 0);
> +
> +  /* parameters are all 0 by default */
> +  TEST_COMPARE (params.busy_poll_usecs, 0);
> +  TEST_COMPARE (params.busy_poll_budget, 0);
> +  TEST_COMPARE (params.prefer_busy_poll, 0);
> +  TEST_COMPARE (params.__pad, 0);
> +
> +  /* set custom parameters */
> +  params.busy_poll_usecs = 40;
> +  params.busy_poll_budget = 8;
> +  params.prefer_busy_poll = 1;
> +  params.__pad = 0;
> +
> +  TEST_COMPARE (ioctl (efd, EPIOCSPARAMS, &params), 0);
> +
> +  memset (&params, 0, sizeof (params));
> +
> +  TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, &params), 0);
> +
> +  /* check custom values were retrieved after being set */
> +  TEST_COMPARE (params.busy_poll_usecs, 40);
> +  TEST_COMPARE (params.busy_poll_budget, 8);
> +  TEST_COMPARE (params.prefer_busy_poll, 1);
> +  TEST_COMPARE (params.__pad, 0);
> +
> +  xclose (efd);
> +}
> +
> +static bool
> +ioctl_supported (void)
> +{
> +  int efd = epoll_create1 (0);
> +  TEST_VERIFY_EXIT (efd != -1);
> +
> +  struct epoll_params params;
> +  int r = ioctl (efd, EPIOCGPARAMS, &params);
> +  xclose (efd);
> +
> +  return (r == 0);
> +}
> +
> +static int
> +do_test (void)
> +{
> +  if (ioctl_supported ())
> +    test_epoll_ioctl ();
> +  else
> +    return EXIT_UNSUPPORTED;
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>


More information about the Libc-alpha mailing list