• André Almeida's avatar
    futex: Implement sys_futex_waitv() · bf69bad3
    André Almeida authored
    Add support to wait on multiple futexes. This is the interface
    implemented by this syscall:
    
    futex_waitv(struct futex_waitv *waiters, unsigned int nr_futexes,
    	    unsigned int flags, struct timespec *timeout, clockid_t clockid)
    
    struct futex_waitv {
    	__u64 val;
    	__u64 uaddr;
    	__u32 flags;
    	__u32 __reserved;
    };
    
    Given an array of struct futex_waitv, wait on each uaddr. The thread
    wakes if a futex_wake() is performed at any uaddr. The syscall returns
    immediately if any waiter has *uaddr != val. *timeout is an optional
    absolute timeout value for the operation. This syscall supports only
    64bit sized timeout structs. The flags argument of the syscall should be
    empty, but it can be used for future extensions. Flags for shared
    futexes, sizes, etc. should be used on the individual flags of each
    waiter.
    
    __reserved is used for explicit padding and should be 0, but it might be
    used for future extensions. If the userspace uses 32-bit pointers, it
    should make sure to explicitly cast it when assigning to waitv::uaddr.
    
    Returns the array index of one of the woken futexes. There’s no given
    information of how many were woken, or any particular attribute of it
    (if it’s the first woken, if it is of the smaller index...).
    Signed-off-by: default avatarAndré Almeida <andrealmeid@collabora.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210923171111.300673-17-andrealmeid@collabora.com
    bf69bad3
unistd.h 30.6 KB