Path: blob/master/tools/testing/selftests/futex/include/futex2test.h
29270 views
/* SPDX-License-Identifier: GPL-2.0-or-later */1/*2* Futex2 library addons for futex tests3*4* Copyright 2021 Collabora Ltd.5*/6#include <linux/time_types.h>7#include <stdint.h>89#define u64_to_ptr(x) ((void *)(uintptr_t)(x))1011#ifndef __NR_futex_waitv12#define __NR_futex_waitv 44913struct futex_waitv {14__u64 val;15__u64 uaddr;16__u32 flags;17__u32 __reserved;18};19#endif2021#ifndef __NR_futex_wake22#define __NR_futex_wake 45423#endif2425#ifndef __NR_futex_wait26#define __NR_futex_wait 45527#endif2829#ifndef FUTEX2_SIZE_U3230#define FUTEX2_SIZE_U32 0x0231#endif3233#ifndef FUTEX2_NUMA34#define FUTEX2_NUMA 0x0435#endif3637#ifndef FUTEX2_MPOL38#define FUTEX2_MPOL 0x0839#endif4041#ifndef FUTEX2_PRIVATE42#define FUTEX2_PRIVATE FUTEX_PRIVATE_FLAG43#endif4445#ifndef FUTEX2_NO_NODE46#define FUTEX_NO_NODE (-1)47#endif4849#ifndef FUTEX_3250#define FUTEX_32 FUTEX2_SIZE_U3251#endif5253struct futex32_numa {54futex_t futex;55futex_t numa;56};5758/**59* futex_waitv - Wait at multiple futexes, wake on any60* @waiters: Array of waiters61* @nr_waiters: Length of waiters array62* @flags: Operation flags63* @timo: Optional timeout for operation64*/65static inline int futex_waitv(volatile struct futex_waitv *waiters, unsigned long nr_waiters,66unsigned long flags, struct timespec *timo, clockid_t clockid)67{68struct __kernel_timespec ts = {69.tv_sec = timo->tv_sec,70.tv_nsec = timo->tv_nsec,71};7273return syscall(__NR_futex_waitv, waiters, nr_waiters, flags, &ts, clockid);74}7576/*77* futex_wait() - block on uaddr with optional timeout78* @val: Expected value79* @flags: FUTEX2 flags80* @timeout: Relative timeout81* @clockid: Clock id for the timeout82*/83static inline int futex2_wait(void *uaddr, long val, unsigned int flags,84struct timespec *timeout, clockid_t clockid)85{86return syscall(__NR_futex_wait, uaddr, val, ~0U, flags, timeout, clockid);87}8889/*90* futex2_wake() - Wake a number of futexes91* @nr: Number of threads to wake at most92* @flags: FUTEX2 flags93*/94static inline int futex2_wake(void *uaddr, int nr, unsigned int flags)95{96return syscall(__NR_futex_wake, uaddr, ~0U, nr, flags);97}9899100