mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 20:24:12 +08:00
futex: Add sys_futex_wake()
To complement sys_futex_waitv() add sys_futex_wake(). This syscall implements what was previously known as FUTEX_WAKE_BITSET except it uses 'unsigned long' for the bitmask and takes FUTEX2 flags. The 'unsigned long' allows FUTEX2_SIZE_U64 on 64bit platforms. 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/20230921105247.936205525@noisy.programming.kicks-ass.net
This commit is contained in:
parent
698eb82638
commit
9f6c532f59
@ -492,3 +492,4 @@
|
|||||||
560 common set_mempolicy_home_node sys_ni_syscall
|
560 common set_mempolicy_home_node sys_ni_syscall
|
||||||
561 common cachestat sys_cachestat
|
561 common cachestat sys_cachestat
|
||||||
562 common fchmodat2 sys_fchmodat2
|
562 common fchmodat2 sys_fchmodat2
|
||||||
|
563 common futex_wake sys_futex_wake
|
||||||
|
@ -466,3 +466,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
#define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE + 5)
|
#define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE + 5)
|
||||||
#define __ARM_NR_COMPAT_END (__ARM_NR_COMPAT_BASE + 0x800)
|
#define __ARM_NR_COMPAT_END (__ARM_NR_COMPAT_BASE + 0x800)
|
||||||
|
|
||||||
#define __NR_compat_syscalls 453
|
#define __NR_compat_syscalls 455
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
@ -911,6 +911,8 @@ __SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node)
|
|||||||
__SYSCALL(__NR_cachestat, sys_cachestat)
|
__SYSCALL(__NR_cachestat, sys_cachestat)
|
||||||
#define __NR_fchmodat2 452
|
#define __NR_fchmodat2 452
|
||||||
__SYSCALL(__NR_fchmodat2, sys_fchmodat2)
|
__SYSCALL(__NR_fchmodat2, sys_fchmodat2)
|
||||||
|
#define __NR_futex_wake 454
|
||||||
|
__SYSCALL(__NR_futex_wake, sys_futex_wake)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Please add new compat syscalls above this comment and update
|
* Please add new compat syscalls above this comment and update
|
||||||
|
@ -373,3 +373,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -452,3 +452,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -458,3 +458,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -391,3 +391,4 @@
|
|||||||
450 n32 set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 n32 set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 n32 cachestat sys_cachestat
|
451 n32 cachestat sys_cachestat
|
||||||
452 n32 fchmodat2 sys_fchmodat2
|
452 n32 fchmodat2 sys_fchmodat2
|
||||||
|
454 n32 futex_wake sys_futex_wake
|
||||||
|
@ -367,3 +367,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 n64 cachestat sys_cachestat
|
451 n64 cachestat sys_cachestat
|
||||||
452 n64 fchmodat2 sys_fchmodat2
|
452 n64 fchmodat2 sys_fchmodat2
|
||||||
|
454 n64 futex_wake sys_futex_wake
|
||||||
|
@ -440,3 +440,4 @@
|
|||||||
450 o32 set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 o32 set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 o32 cachestat sys_cachestat
|
451 o32 cachestat sys_cachestat
|
||||||
452 o32 fchmodat2 sys_fchmodat2
|
452 o32 fchmodat2 sys_fchmodat2
|
||||||
|
454 o32 futex_wake sys_futex_wake
|
||||||
|
@ -451,3 +451,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -539,3 +539,4 @@
|
|||||||
450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -455,3 +455,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat sys_cachestat
|
451 common cachestat sys_cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake sys_futex_wake
|
||||||
|
@ -455,3 +455,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -498,3 +498,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -457,3 +457,4 @@
|
|||||||
450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 i386 cachestat sys_cachestat
|
451 i386 cachestat sys_cachestat
|
||||||
452 i386 fchmodat2 sys_fchmodat2
|
452 i386 fchmodat2 sys_fchmodat2
|
||||||
|
454 i386 futex_wake sys_futex_wake
|
||||||
|
@ -375,6 +375,7 @@
|
|||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
453 64 map_shadow_stack sys_map_shadow_stack
|
453 64 map_shadow_stack sys_map_shadow_stack
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
|
||||||
#
|
#
|
||||||
# Due to a historical design error, certain syscalls are numbered differently
|
# Due to a historical design error, certain syscalls are numbered differently
|
||||||
|
@ -423,3 +423,4 @@
|
|||||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||||
451 common cachestat sys_cachestat
|
451 common cachestat sys_cachestat
|
||||||
452 common fchmodat2 sys_fchmodat2
|
452 common fchmodat2 sys_fchmodat2
|
||||||
|
454 common futex_wake sys_futex_wake
|
||||||
|
@ -549,6 +549,9 @@ asmlinkage long sys_set_robust_list(struct robust_list_head __user *head,
|
|||||||
asmlinkage long sys_futex_waitv(struct futex_waitv *waiters,
|
asmlinkage long sys_futex_waitv(struct futex_waitv *waiters,
|
||||||
unsigned int nr_futexes, unsigned int flags,
|
unsigned int nr_futexes, unsigned int flags,
|
||||||
struct __kernel_timespec __user *timeout, clockid_t clockid);
|
struct __kernel_timespec __user *timeout, clockid_t clockid);
|
||||||
|
|
||||||
|
asmlinkage long sys_futex_wake(void __user *uaddr, unsigned long mask, int nr, unsigned int flags);
|
||||||
|
|
||||||
asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp,
|
asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp,
|
||||||
struct __kernel_timespec __user *rmtp);
|
struct __kernel_timespec __user *rmtp);
|
||||||
asmlinkage long sys_nanosleep_time32(struct old_timespec32 __user *rqtp,
|
asmlinkage long sys_nanosleep_time32(struct old_timespec32 __user *rqtp,
|
||||||
|
@ -822,9 +822,11 @@ __SYSCALL(__NR_cachestat, sys_cachestat)
|
|||||||
|
|
||||||
#define __NR_fchmodat2 452
|
#define __NR_fchmodat2 452
|
||||||
__SYSCALL(__NR_fchmodat2, sys_fchmodat2)
|
__SYSCALL(__NR_fchmodat2, sys_fchmodat2)
|
||||||
|
#define __NR_futex_wake 454
|
||||||
|
__SYSCALL(__NR_futex_wake, sys_futex_wake)
|
||||||
|
|
||||||
#undef __NR_syscalls
|
#undef __NR_syscalls
|
||||||
#define __NR_syscalls 453
|
#define __NR_syscalls 455
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 32 bit systems traditionally used different
|
* 32 bit systems traditionally used different
|
||||||
|
@ -306,6 +306,36 @@ destroy_timer:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sys_futex_wake - Wake a number of futexes
|
||||||
|
* @uaddr: Address of the futex(es) to wake
|
||||||
|
* @mask: bitmask
|
||||||
|
* @nr: Number of the futexes to wake
|
||||||
|
* @flags: FUTEX2 flags
|
||||||
|
*
|
||||||
|
* Identical to the traditional FUTEX_WAKE_BITSET op, except it is part of the
|
||||||
|
* futex2 family of calls.
|
||||||
|
*/
|
||||||
|
|
||||||
|
SYSCALL_DEFINE4(futex_wake,
|
||||||
|
void __user *, uaddr,
|
||||||
|
unsigned long, mask,
|
||||||
|
int, nr,
|
||||||
|
unsigned int, flags)
|
||||||
|
{
|
||||||
|
if (flags & ~FUTEX2_VALID_MASK)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
flags = futex2_to_flags(flags);
|
||||||
|
if (!futex_flags_valid(flags))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!futex_validate_input(flags, mask))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return futex_wake(uaddr, flags, nr, mask);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
COMPAT_SYSCALL_DEFINE2(set_robust_list,
|
COMPAT_SYSCALL_DEFINE2(set_robust_list,
|
||||||
struct compat_robust_list_head __user *, head,
|
struct compat_robust_list_head __user *, head,
|
||||||
|
@ -87,6 +87,7 @@ COND_SYSCALL_COMPAT(set_robust_list);
|
|||||||
COND_SYSCALL(get_robust_list);
|
COND_SYSCALL(get_robust_list);
|
||||||
COND_SYSCALL_COMPAT(get_robust_list);
|
COND_SYSCALL_COMPAT(get_robust_list);
|
||||||
COND_SYSCALL(futex_waitv);
|
COND_SYSCALL(futex_waitv);
|
||||||
|
COND_SYSCALL(futex_wake);
|
||||||
COND_SYSCALL(kexec_load);
|
COND_SYSCALL(kexec_load);
|
||||||
COND_SYSCALL_COMPAT(kexec_load);
|
COND_SYSCALL_COMPAT(kexec_load);
|
||||||
COND_SYSCALL(init_module);
|
COND_SYSCALL(init_module);
|
||||||
|
Loading…
Reference in New Issue
Block a user