Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

futex: Add sys_futex_requeue()

Finish off the 'simple' futex2 syscall group by adding
sys_futex_requeue(). Unlike sys_futex_{wait,wake}() its arguments are
too numerous to fit into a regular syscall. As such, use struct
futex_waitv to pass the 'source' and 'destination' futexes to the
syscall.

This syscall implements what was previously known as FUTEX_CMP_REQUEUE
and uses {val, uaddr, flags} for source and {uaddr, flags} for
destination.

This design explicitly allows requeueing between different types of
futex by having a different flags word per uaddr.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/r/20230921105248.511860556@noisy.programming.kicks-ass.net

+64 -2
+1
arch/alpha/kernel/syscalls/syscall.tbl
··· 494 494 562 common fchmodat2 sys_fchmodat2 495 495 563 common futex_wake sys_futex_wake 496 496 564 common futex_wait sys_futex_wait 497 + 565 common futex_requeue sys_futex_requeue
+1
arch/arm/tools/syscall.tbl
··· 468 468 452 common fchmodat2 sys_fchmodat2 469 469 454 common futex_wake sys_futex_wake 470 470 455 common futex_wait sys_futex_wait 471 + 456 common futex_requeue sys_futex_requeue
+1 -1
arch/arm64/include/asm/unistd.h
··· 39 39 #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE + 5) 40 40 #define __ARM_NR_COMPAT_END (__ARM_NR_COMPAT_BASE + 0x800) 41 41 42 - #define __NR_compat_syscalls 456 42 + #define __NR_compat_syscalls 457 43 43 #endif 44 44 45 45 #define __ARCH_WANT_SYS_CLONE
+2
arch/arm64/include/asm/unistd32.h
··· 915 915 __SYSCALL(__NR_futex_wake, sys_futex_wake) 916 916 #define __NR_futex_wait 455 917 917 __SYSCALL(__NR_futex_wait, sys_futex_wait) 918 + #define __NR_futex_requeue 456 919 + __SYSCALL(__NR_futex_requeue, sys_futex_requeue) 918 920 919 921 /* 920 922 * Please add new compat syscalls above this comment and update
+1
arch/ia64/kernel/syscalls/syscall.tbl
··· 375 375 452 common fchmodat2 sys_fchmodat2 376 376 454 common futex_wake sys_futex_wake 377 377 455 common futex_wait sys_futex_wait 378 + 456 common futex_requeue sys_futex_requeue
+1
arch/m68k/kernel/syscalls/syscall.tbl
··· 454 454 452 common fchmodat2 sys_fchmodat2 455 455 454 common futex_wake sys_futex_wake 456 456 455 common futex_wait sys_futex_wait 457 + 456 common futex_requeue sys_futex_requeue
+1
arch/microblaze/kernel/syscalls/syscall.tbl
··· 460 460 452 common fchmodat2 sys_fchmodat2 461 461 454 common futex_wake sys_futex_wake 462 462 455 common futex_wait sys_futex_wait 463 + 456 common futex_requeue sys_futex_requeue
+1
arch/mips/kernel/syscalls/syscall_n32.tbl
··· 393 393 452 n32 fchmodat2 sys_fchmodat2 394 394 454 n32 futex_wake sys_futex_wake 395 395 455 n32 futex_wait sys_futex_wait 396 + 456 n32 futex_requeue sys_futex_requeue
+1
arch/mips/kernel/syscalls/syscall_n64.tbl
··· 369 369 452 n64 fchmodat2 sys_fchmodat2 370 370 454 n64 futex_wake sys_futex_wake 371 371 455 n64 futex_wait sys_futex_wait 372 + 456 n64 futex_requeue sys_futex_requeue
+1
arch/mips/kernel/syscalls/syscall_o32.tbl
··· 442 442 452 o32 fchmodat2 sys_fchmodat2 443 443 454 o32 futex_wake sys_futex_wake 444 444 455 o32 futex_wait sys_futex_wait 445 + 456 o32 futex_requeue sys_futex_requeue
+1
arch/parisc/kernel/syscalls/syscall.tbl
··· 453 453 452 common fchmodat2 sys_fchmodat2 454 454 454 common futex_wake sys_futex_wake 455 455 455 common futex_wait sys_futex_wait 456 + 456 common futex_requeue sys_futex_requeue
+1
arch/powerpc/kernel/syscalls/syscall.tbl
··· 541 541 452 common fchmodat2 sys_fchmodat2 542 542 454 common futex_wake sys_futex_wake 543 543 455 common futex_wait sys_futex_wait 544 + 456 common futex_requeue sys_futex_requeue
+1
arch/s390/kernel/syscalls/syscall.tbl
··· 457 457 452 common fchmodat2 sys_fchmodat2 sys_fchmodat2 458 458 454 common futex_wake sys_futex_wake sys_futex_wake 459 459 455 common futex_wait sys_futex_wait sys_futex_wait 460 + 456 common futex_requeue sys_futex_requeue sys_futex_requeue
+1
arch/sh/kernel/syscalls/syscall.tbl
··· 457 457 452 common fchmodat2 sys_fchmodat2 458 458 454 common futex_wake sys_futex_wake 459 459 455 common futex_wait sys_futex_wait 460 + 456 common futex_requeue sys_futex_requeue
+1
arch/sparc/kernel/syscalls/syscall.tbl
··· 500 500 452 common fchmodat2 sys_fchmodat2 501 501 454 common futex_wake sys_futex_wake 502 502 455 common futex_wait sys_futex_wait 503 + 456 common futex_requeue sys_futex_requeue
+1
arch/x86/entry/syscalls/syscall_32.tbl
··· 459 459 452 i386 fchmodat2 sys_fchmodat2 460 460 454 i386 futex_wake sys_futex_wake 461 461 455 i386 futex_wait sys_futex_wait 462 + 456 i386 futex_requeue sys_futex_requeue
+1
arch/x86/entry/syscalls/syscall_64.tbl
··· 377 377 453 64 map_shadow_stack sys_map_shadow_stack 378 378 454 common futex_wake sys_futex_wake 379 379 455 common futex_wait sys_futex_wait 380 + 456 common futex_requeue sys_futex_requeue 380 381 381 382 # 382 383 # Due to a historical design error, certain syscalls are numbered differently
+1
arch/xtensa/kernel/syscalls/syscall.tbl
··· 425 425 452 common fchmodat2 sys_fchmodat2 426 426 454 common futex_wake sys_futex_wake 427 427 455 common futex_wait sys_futex_wait 428 + 456 common futex_requeue sys_futex_requeue
+3
include/linux/syscalls.h
··· 556 556 unsigned int flags, struct __kernel_timespec __user *timespec, 557 557 clockid_t clockid); 558 558 559 + asmlinkage long sys_futex_requeue(struct futex_waitv __user *waiters, 560 + unsigned int flags, int nr_wake, int nr_requeue); 561 + 559 562 asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp, 560 563 struct __kernel_timespec __user *rmtp); 561 564 asmlinkage long sys_nanosleep_time32(struct old_timespec32 __user *rqtp,
+3 -1
include/uapi/asm-generic/unistd.h
··· 826 826 __SYSCALL(__NR_futex_wake, sys_futex_wake) 827 827 #define __NR_futex_wait 455 828 828 __SYSCALL(__NR_futex_wait, sys_futex_wait) 829 + #define __NR_futex_requeue 456 830 + __SYSCALL(__NR_futex_requeue, sys_futex_requeue) 829 831 830 832 #undef __NR_syscalls 831 - #define __NR_syscalls 456 833 + #define __NR_syscalls 457 832 834 833 835 /* 834 836 * 32 bit systems traditionally used different
+38
kernel/futex/syscalls.c
··· 396 396 return ret; 397 397 } 398 398 399 + /* 400 + * sys_futex_requeue - Requeue a waiter from one futex to another 401 + * @waiters: array describing the source and destination futex 402 + * @flags: unused 403 + * @nr_wake: number of futexes to wake 404 + * @nr_requeue: number of futexes to requeue 405 + * 406 + * Identical to the traditional FUTEX_CMP_REQUEUE op, except it is part of the 407 + * futex2 family of calls. 408 + */ 409 + 410 + SYSCALL_DEFINE4(futex_requeue, 411 + struct futex_waitv __user *, waiters, 412 + unsigned int, flags, 413 + int, nr_wake, 414 + int, nr_requeue) 415 + { 416 + struct futex_vector futexes[2]; 417 + u32 cmpval; 418 + int ret; 419 + 420 + if (flags) 421 + return -EINVAL; 422 + 423 + if (!waiters) 424 + return -EINVAL; 425 + 426 + ret = futex_parse_waitv(futexes, waiters, 2); 427 + if (ret) 428 + return ret; 429 + 430 + cmpval = futexes[0].w.val; 431 + 432 + return futex_requeue(u64_to_user_ptr(futexes[0].w.uaddr), futexes[0].w.flags, 433 + u64_to_user_ptr(futexes[1].w.uaddr), futexes[1].w.flags, 434 + nr_wake, nr_requeue, &cmpval, 0); 435 + } 436 + 399 437 #ifdef CONFIG_COMPAT 400 438 COMPAT_SYSCALL_DEFINE2(set_robust_list, 401 439 struct compat_robust_list_head __user *, head,
+1
kernel/sys_ni.c
··· 89 89 COND_SYSCALL(futex_waitv); 90 90 COND_SYSCALL(futex_wake); 91 91 COND_SYSCALL(futex_wait); 92 + COND_SYSCALL(futex_requeue); 92 93 COND_SYSCALL(kexec_load); 93 94 COND_SYSCALL_COMPAT(kexec_load); 94 95 COND_SYSCALL(init_module);