On Wed, Nov 18, 2020 at 9:46 AM Willem de Bruijn <willemdebruijn.kernel@xxxxxxxxx> wrote: > > From: Willem de Bruijn <willemb@xxxxxxxxxx> > > Add syscall epoll_pwait2, an epoll_wait variant with nsec resolution > that replaces int timeout with struct timespec. It is equivalent > otherwise. > > int epoll_pwait2(int fd, struct epoll_event *events, > int maxevents, > const struct timespec *timeout, > const sigset_t *sigset); > > The underlying hrtimer is already programmed with nsec resolution. > pselect and ppoll also set nsec resolution timeout with timespec. > > The sigset_t in epoll_pwait has a compat variant. epoll_pwait2 needs > the same. > > For timespec, only support this new interface on 2038 aware platforms > that define __kernel_timespec_t. So no CONFIG_COMPAT_32BIT_TIME. > > Changes > v3: > - rewrite: add epoll_pwait2 syscall instead of epoll_create1 flag > v2: > - cast to s64: avoid overflow on 32-bit platforms (Shuo Chen) > - minor commit message rewording > > Signed-off-by: Willem de Bruijn <willemb@xxxxxxxxxx> > > --- > diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl > index 109e6681b8fa..9a4e8ec207fc 100644 > --- a/arch/x86/entry/syscalls/syscall_32.tbl > +++ b/arch/x86/entry/syscalls/syscall_32.tbl > @@ -447,3 +447,4 @@ > 440 i386 process_madvise sys_process_madvise > 441 i386 watch_mount sys_watch_mount > 442 i386 memfd_secret sys_memfd_secret > +443 i386 epoll_pwait2 sys_epoll_pwait2 compat_sys_epoll_pwait2 I should have caught this sooner, but this does not work as intended. x86 will still call epoll_pwait2 with old_timespec32. One approach is a separate epoll_pwait2_time64 syscall, similar to ppoll_time64. But that was added to work around legacy 32-bit ppoll. Not needed for a new API. In libc, ppoll_time64 is declared with type struct __timespec64. That type is not defined in Linux uapi. Will need to look at this some more.