Message ID | 20240528173706.511391-2-jdamato@fastly.com |
---|---|
State | New |
Headers | show |
Series | Linux: Add epoll ioctls | expand |
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, ¶ms), 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, ¶ms), 0); > + > + memset (¶ms, 0, sizeof (params)); > + > + TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, ¶ms), 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, ¶ms); > + 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>
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, ¶ms), 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, ¶ms), 0); > > + > > + memset (¶ms, 0, sizeof (params)); > > + > > + TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, ¶ms), 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, ¶ms); > > + 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>
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, ¶ms), 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, ¶ms), 0); > > > + > > > + memset (¶ms, 0, sizeof (params)); > > > + > > > + TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, ¶ms), 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, ¶ms); > > > + 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>
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, ¶ms), 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, ¶ms), 0); > > > > + > > > > + memset (¶ms, 0, sizeof (params)); > > > > + > > > > + TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, ¶ms), 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, ¶ms); > > > > + 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>
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.
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 --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, ¶ms), 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, ¶ms), 0); + + memset (¶ms, 0, sizeof (params)); + + TEST_COMPARE (ioctl (efd, EPIOCGPARAMS, ¶ms), 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, ¶ms); + 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>
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