xref: /linux/tools/testing/selftests/futex/include/futex2test.h (revision b3570b00dc3062c5a5e8d9602b923618d679636a)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Futex2 library addons for futex tests
4  *
5  * Copyright 2021 Collabora Ltd.
6  */
7 #include <stdint.h>
8 
9 #define u64_to_ptr(x) ((void *)(uintptr_t)(x))
10 
11 #ifndef __NR_futex_waitv
12 #define __NR_futex_waitv 449
13 struct futex_waitv {
14 	__u64 val;
15 	__u64 uaddr;
16 	__u32 flags;
17 	__u32 __reserved;
18 };
19 #endif
20 
21 #ifndef __NR_futex_wake
22 #define __NR_futex_wake 454
23 #endif
24 
25 #ifndef __NR_futex_wait
26 #define __NR_futex_wait 455
27 #endif
28 
29 #ifndef FUTEX2_SIZE_U32
30 #define FUTEX2_SIZE_U32 0x02
31 #endif
32 
33 #ifndef FUTEX2_NUMA
34 #define FUTEX2_NUMA 0x04
35 #endif
36 
37 #ifndef FUTEX2_MPOL
38 #define FUTEX2_MPOL 0x08
39 #endif
40 
41 #ifndef FUTEX2_PRIVATE
42 #define FUTEX2_PRIVATE FUTEX_PRIVATE_FLAG
43 #endif
44 
45 #ifndef FUTEX2_NO_NODE
46 #define FUTEX_NO_NODE (-1)
47 #endif
48 
49 #ifndef FUTEX_32
50 #define FUTEX_32 FUTEX2_SIZE_U32
51 #endif
52 
53 struct futex32_numa {
54 	futex_t futex;
55 	futex_t numa;
56 };
57 
58 /**
59  * futex_waitv - Wait at multiple futexes, wake on any
60  * @waiters:    Array of waiters
61  * @nr_waiters: Length of waiters array
62  * @flags: Operation flags
63  * @timo:  Optional timeout for operation
64  */
65 static inline int futex_waitv(volatile struct futex_waitv *waiters, unsigned long nr_waiters,
66 			      unsigned long flags, struct timespec *timo, clockid_t clockid)
67 {
68 	return syscall(__NR_futex_waitv, waiters, nr_waiters, flags, timo, clockid);
69 }
70 
71 /*
72  * futex_wait() - block on uaddr with optional timeout
73  * @val:	Expected value
74  * @flags:	FUTEX2 flags
75  * @timeout:	Relative timeout
76  * @clockid:	Clock id for the timeout
77  */
78 static inline int futex2_wait(void *uaddr, long val, unsigned int flags,
79 			      struct timespec *timeout, clockid_t clockid)
80 {
81 	return syscall(__NR_futex_wait, uaddr, val, ~0U, flags, timeout, clockid);
82 }
83 
84 /*
85  * futex2_wake() - Wake a number of futexes
86  * @nr:		Number of threads to wake at most
87  * @flags:	FUTEX2 flags
88  */
89 static inline int futex2_wake(void *uaddr, int nr, unsigned int flags)
90 {
91 	return syscall(__NR_futex_wake, uaddr, ~0U, nr, flags);
92 }
93