diff mbox series

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

Message ID 20240528173706.511391-2-jdamato@fastly.com
State New
Headers show
Series Linux: Add epoll ioctls | expand

Commit Message

Joe Damato May 28, 2024, 5:37 p.m. UTC
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>
---
 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

Comments

Adhemerval Zanella May 29, 2024, 2:14 p.m. UTC | #1
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>
Joe Damato May 31, 2024, 6:59 p.m. UTC | #2
On Wed, May 29, 2024 at 11:14:32AM -0300, Adhemerval Zanella Netto wrote:
> 
> 
> 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>

Thanks for the review!

Do I need to do anything to get this pushed? Not sure what the libc
process is, but AFAIK I don't have (nor do I want) write access to
the repo to push.

> > ---
> >  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>
Joe Damato June 4, 2024, 3:36 p.m. UTC | #3
On Fri, May 31, 2024 at 11:59:19AM -0700, Joe Damato wrote:
> On Wed, May 29, 2024 at 11:14:32AM -0300, Adhemerval Zanella Netto wrote:
> > 
> > 
> > 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>
> 
> Thanks for the review!
> 
> Do I need to do anything to get this pushed? Not sure what the libc
> process is, but AFAIK I don't have (nor do I want) write access to
> the repo to push.

I noticed in patchwork that this is set to "Committed" but it does
appear in the shortlong for glibc.

Maybe I am looking in the wrong place?

Patchwork: https://patchwork.sourceware.org/project/glibc/patch/20240528173706.511391-2-jdamato@fastly.com/
shortlog: https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/master

If some one could let me know what, if anything, I need to do to get
this pushed that would super helpful.

Thanks,
Joe
 
> > > ---
> > >  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>
Noah Goldstein June 4, 2024, 3:50 p.m. UTC | #4
On Tue, Jun 4, 2024 at 10:36 AM Joe Damato <jdamato@fastly.com> wrote:
>
> On Fri, May 31, 2024 at 11:59:19AM -0700, Joe Damato wrote:
> > On Wed, May 29, 2024 at 11:14:32AM -0300, Adhemerval Zanella Netto wrote:
> > >
> > >
> > > 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>
> >
> > Thanks for the review!
> >
> > Do I need to do anything to get this pushed? Not sure what the libc
> > process is, but AFAIK I don't have (nor do I want) write access to
> > the repo to push.
>
> I noticed in patchwork that this is set to "Committed" but it does
> appear in the shortlong for glibc.
>
> Maybe I am looking in the wrong place?
>
> Patchwork: https://patchwork.sourceware.org/project/glibc/patch/20240528173706.511391-2-jdamato@fastly.com/
> shortlog: https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/master
>
> If some one could let me know what, if anything, I need to do to get
> this pushed that would super helpful.
>
> Thanks,
> Joe
>

Doesn't appear to have been pushed.

I'll push this now.
> > > > ---
> > > >  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>
Adhemerval Zanella June 4, 2024, 3:51 p.m. UTC | #5
On 04/06/24 12:50, Noah Goldstein wrote:
> On Tue, Jun 4, 2024 at 10:36 AM Joe Damato <jdamato@fastly.com> wrote:
>>
>> On Fri, May 31, 2024 at 11:59:19AM -0700, Joe Damato wrote:
>>> On Wed, May 29, 2024 at 11:14:32AM -0300, Adhemerval Zanella Netto wrote:
>>>>
>>>>
>>>> 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>
>>>
>>> Thanks for the review!
>>>
>>> Do I need to do anything to get this pushed? Not sure what the libc
>>> process is, but AFAIK I don't have (nor do I want) write access to
>>> the repo to push.
>>
>> I noticed in patchwork that this is set to "Committed" but it does
>> appear in the shortlong for glibc.
>>
>> Maybe I am looking in the wrong place?
>>
>> Patchwork: https://patchwork.sourceware.org/project/glibc/patch/20240528173706.511391-2-jdamato@fastly.com/
>> shortlog: https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/master
>>
>> If some one could let me know what, if anything, I need to do to get
>> this pushed that would super helpful.
>>
>> Thanks,
>> Joe
>>
> 
> Doesn't appear to have been pushed.
> 
> I'll push this now.

Sorry about that, I though I had it installed we I marked it Commited but I 
forgot to do so.

Thanks Noah.
Joe Damato June 4, 2024, 4:06 p.m. UTC | #6
On Tue, Jun 04, 2024 at 12:51:39PM -0300, Adhemerval Zanella Netto wrote:
> 
> 
> On 04/06/24 12:50, Noah Goldstein wrote:
> > On Tue, Jun 4, 2024 at 10:36 AM Joe Damato <jdamato@fastly.com> wrote:
> >>
> >> On Fri, May 31, 2024 at 11:59:19AM -0700, Joe Damato wrote:
> >>> On Wed, May 29, 2024 at 11:14:32AM -0300, Adhemerval Zanella Netto wrote:
> >>>>
> >>>>
> >>>> 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>
> >>>
> >>> Thanks for the review!
> >>>
> >>> Do I need to do anything to get this pushed? Not sure what the libc
> >>> process is, but AFAIK I don't have (nor do I want) write access to
> >>> the repo to push.
> >>
> >> I noticed in patchwork that this is set to "Committed" but it does
> >> appear in the shortlong for glibc.
> >>
> >> Maybe I am looking in the wrong place?
> >>
> >> Patchwork: https://patchwork.sourceware.org/project/glibc/patch/20240528173706.511391-2-jdamato@fastly.com/
> >> shortlog: https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/master
> >>
> >> If some one could let me know what, if anything, I need to do to get
> >> this pushed that would super helpful.
> >>
> >> Thanks,
> >> Joe
> >>
> > 
> > Doesn't appear to have been pushed.
> > 
> > I'll push this now.
> 
> Sorry about that, I though I had it installed we I marked it Commited but I 
> forgot to do so.
> 
> Thanks Noah.

Thanks Adhemerval for confirming and Noah for offering to push.

I'll keep an eye on glibc's git for the commit to come through.

Thank you,
Joe
diff mbox series

Patch

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>