Message ID | 20200709175921.211387-1-andrealmeid@collabora.com |
---|---|
Headers | show |
Series | futex2: Add new futex interface | expand |
Hello. On 09.07.2020 19:59, André Almeida wrote: > This RFC is a followup to the previous discussion initiated from my > last > patch "futex: Implement mechanism to wait on any of several > futexes"[1]. > As stated in the thread, the correct approach to move forward with the > wait multiple operation would be to create a new syscall that would > have > all new cool features. > > The first patch adds the new interface and just translate the call for > the old interface, without implementing new features. The goal here is > to establish the interface and to check if everyone is happy with this > API. The rest of patches are selftests to show the interface in action. > I have the following questions: > > - What suggestions do you have to implement this? Start from scratch or > reuse the most code possible? > > - The interface seems correct and implements the requirements asked by > you? > > Those are the cool new features that this syscall should address some > day: > > - Operate with variable bit size futexes, not restricted to 32: > 8, 16 and 64 > > - Wait on multiple futexes, using the following semantics: > > struct futex_wait { > void *uaddr; > unsigned long val; > unsigned long flags; > }; > > sys_futex_waitv(struct futex_wait *waiters, unsigned int nr_waiters, > unsigned long flags, struct __kernel_timespec *timo); > > - Have NUMA optimizations: if FUTEX_NUMA_FLAG is set, the `void *uaddr` > argument won't be a value of type u{8, 16, 32, 64} anymore, but a > struct > containing a NUMA node hint: > > struct futex32_numa { > u32 value __attribute__ ((aligned (8))); > u32 hint; > }; > > struct futex64_numa { > u64 value __attribute__ ((aligned (16))); > u64 hint; > }; > > Thanks, > André > > Changes since v1: > - The timeout argument now uses __kernel_timespec as type > - time32 interface was removed > v1: https://lore.kernel.org/patchwork/cover/1255437/ > > [1] https://lore.kernel.org/patchwork/patch/1194339/ > > André Almeida (4): > futex2: Add new futex interface > selftests: futex: Add futex2 wake/wait test > selftests: futex: Add futex2 timeout test > selftests: futex: Add futex2 wouldblock test > > MAINTAINERS | 2 +- > arch/x86/entry/syscalls/syscall_32.tbl | 2 + > arch/x86/entry/syscalls/syscall_64.tbl | 2 + > include/linux/syscalls.h | 7 ++ > include/uapi/asm-generic/unistd.h | 8 +- > include/uapi/linux/futex.h | 10 ++ > init/Kconfig | 7 ++ > kernel/Makefile | 1 + > kernel/futex2.c | 73 ++++++++++++ > kernel/sys_ni.c | 4 + > tools/include/uapi/asm-generic/unistd.h | 7 +- > .../selftests/futex/functional/.gitignore | 1 + > .../selftests/futex/functional/Makefile | 4 +- > .../selftests/futex/functional/futex2_wait.c | 111 ++++++++++++++++++ > .../futex/functional/futex_wait_timeout.c | 38 ++++-- > .../futex/functional/futex_wait_wouldblock.c | 33 +++++- > .../testing/selftests/futex/functional/run.sh | 3 + > .../selftests/futex/include/futex2test.h | 77 ++++++++++++ > 18 files changed, 373 insertions(+), 17 deletions(-) > create mode 100644 kernel/futex2.c > create mode 100644 > tools/testing/selftests/futex/functional/futex2_wait.c > create mode 100644 tools/testing/selftests/futex/include/futex2test.h What branch/tag this submission is based on please? It seems it is not a 5.8 but rather 5.7 since the second patch misses faccessat2() syscall and fails to be applied cleanly. Thanks.
Hi On 7/10/20 10:23 AM, Oleksandr Natalenko wrote: > Hello. > > On 09.07.2020 19:59, André Almeida wrote: >> This RFC is a followup to the previous discussion initiated from my last >> patch "futex: Implement mechanism to wait on any of several futexes"[1]. >> As stated in the thread, the correct approach to move forward with the >> wait multiple operation would be to create a new syscall that would have >> all new cool features. >> >> The first patch adds the new interface and just translate the call for >> the old interface, without implementing new features. The goal here is >> to establish the interface and to check if everyone is happy with this >> API. The rest of patches are selftests to show the interface in action. >> I have the following questions: >> >> - What suggestions do you have to implement this? Start from scratch or >> reuse the most code possible? >> >> - The interface seems correct and implements the requirements asked by >> you? >> >> Those are the cool new features that this syscall should address some >> day: >> >> - Operate with variable bit size futexes, not restricted to 32: >> 8, 16 and 64 >> >> - Wait on multiple futexes, using the following semantics: >> >> struct futex_wait { >> void *uaddr; >> unsigned long val; >> unsigned long flags; >> }; >> >> sys_futex_waitv(struct futex_wait *waiters, unsigned int nr_waiters, >> unsigned long flags, struct __kernel_timespec *timo); >> >> - Have NUMA optimizations: if FUTEX_NUMA_FLAG is set, the `void *uaddr` >> argument won't be a value of type u{8, 16, 32, 64} anymore, but a >> struct >> containing a NUMA node hint: >> >> struct futex32_numa { >> u32 value __attribute__ ((aligned (8))); >> u32 hint; >> }; >> >> struct futex64_numa { >> u64 value __attribute__ ((aligned (16))); >> u64 hint; >> }; >> >> Thanks, >> André >> >> Changes since v1: >> - The timeout argument now uses __kernel_timespec as type >> - time32 interface was removed >> v1: https://lore.kernel.org/patchwork/cover/1255437/ >> >> [1] https://lore.kernel.org/patchwork/patch/1194339/ >> >> André Almeida (4): >> futex2: Add new futex interface >> selftests: futex: Add futex2 wake/wait test >> selftests: futex: Add futex2 timeout test >> selftests: futex: Add futex2 wouldblock test >> >> MAINTAINERS | 2 +- >> arch/x86/entry/syscalls/syscall_32.tbl | 2 + >> arch/x86/entry/syscalls/syscall_64.tbl | 2 + >> include/linux/syscalls.h | 7 ++ >> include/uapi/asm-generic/unistd.h | 8 +- >> include/uapi/linux/futex.h | 10 ++ >> init/Kconfig | 7 ++ >> kernel/Makefile | 1 + >> kernel/futex2.c | 73 ++++++++++++ >> kernel/sys_ni.c | 4 + >> tools/include/uapi/asm-generic/unistd.h | 7 +- >> .../selftests/futex/functional/.gitignore | 1 + >> .../selftests/futex/functional/Makefile | 4 +- >> .../selftests/futex/functional/futex2_wait.c | 111 ++++++++++++++++++ >> .../futex/functional/futex_wait_timeout.c | 38 ++++-- >> .../futex/functional/futex_wait_wouldblock.c | 33 +++++- >> .../testing/selftests/futex/functional/run.sh | 3 + >> .../selftests/futex/include/futex2test.h | 77 ++++++++++++ >> 18 files changed, 373 insertions(+), 17 deletions(-) >> create mode 100644 kernel/futex2.c >> create mode 100644 >> tools/testing/selftests/futex/functional/futex2_wait.c >> create mode 100644 tools/testing/selftests/futex/include/futex2test.h > > What branch/tag this submission is based on please? It seems it is not a > 5.8 but rather 5.7 since the second patch misses faccessat2() syscall > and fails to be applied cleanly. > As stated in MAINTAINERS[1], this submission is based on locking/core branch from tip/tip[2] tree. The most updated release tag in this tree is v5.8-rc1. My patches applied on top of locking/core are available in my tree: https://gitlab.collabora.com/tonyk/linux/-/commits/futex2 According to 6c3c184fc420 ("tools headers API: Update faccessat2 affected files"), it seems that `faccessat2` entry at `tools/include/uapi/asm-generic/unistd.h` was added after the syscall was merged, so that's why 5.8-rc1 misses the syscall in this specific file. Rebasing locking/core in 5.8-rc2 or above will fix that. > Thanks. > Thanks, André [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/MAINTAINERS?h=v5.8-rc4#n7102 [2] https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/log/?h=locking/core