]> git.sesse.net Git - bcachefs-tools-debian/blob - include/linux/bit_spinlock.h
A small compile fix
[bcachefs-tools-debian] / include / linux / bit_spinlock.h
1 #ifndef __LINUX_BIT_SPINLOCK_H
2 #define __LINUX_BIT_SPINLOCK_H
3
4 #include <linux/kernel.h>
5 #include <linux/preempt.h>
6 #include <linux/futex.h>
7 #include <urcu/futex.h>
8
9 static inline void bit_spin_lock(int nr, unsigned long *_addr)
10 {
11         u32 mask, *addr = ((u32 *) _addr) + (nr / 32), v;
12
13         nr &= 31;
14         mask = 1U << nr;
15
16         while (1) {
17                 v = __atomic_fetch_or(addr, mask, __ATOMIC_ACQUIRE);
18                 if (!(v & mask))
19                         break;
20
21                 futex(addr, FUTEX_WAIT|FUTEX_PRIVATE_FLAG, v, NULL, NULL, 0);
22         }
23 }
24
25 static inline void bit_spin_wake(int nr, unsigned long *_addr)
26 {
27         u32 *addr = ((u32 *) _addr) + (nr / 32);
28
29         futex(addr, FUTEX_WAKE|FUTEX_PRIVATE_FLAG, INT_MAX, NULL, NULL, 0);
30 }
31
32 static inline void bit_spin_unlock(int nr, unsigned long *_addr)
33 {
34         u32 mask, *addr = ((u32 *) _addr) + (nr / 32);
35
36         nr &= 31;
37         mask = 1U << nr;
38
39         __atomic_and_fetch(addr, ~mask, __ATOMIC_RELEASE);
40         futex(addr, FUTEX_WAKE|FUTEX_PRIVATE_FLAG, INT_MAX, NULL, NULL, 0);
41 }
42
43 #endif /* __LINUX_BIT_SPINLOCK_H */
44