Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
90631822 JL |
2 | #ifndef __LINUX_OSQ_LOCK_H |
3 | #define __LINUX_OSQ_LOCK_H | |
4 | ||
5 | /* | |
6 | * An MCS like lock especially tailored for optimistic spinning for sleeping | |
7 | * lock implementations (mutex, rwsem, etc). | |
8 | */ | |
d84b6728 DB |
9 | struct optimistic_spin_node { |
10 | struct optimistic_spin_node *next, *prev; | |
11 | int locked; /* 1 if lock acquired */ | |
12 | int cpu; /* encoded CPU # + 1 value */ | |
13 | }; | |
90631822 JL |
14 | |
15 | struct optimistic_spin_queue { | |
16 | /* | |
17 | * Stores an encoded value of the CPU # of the tail node in the queue. | |
18 | * If the queue is empty, then it's set to OSQ_UNLOCKED_VAL. | |
19 | */ | |
20 | atomic_t tail; | |
21 | }; | |
22 | ||
d84b6728 DB |
23 | #define OSQ_UNLOCKED_VAL (0) |
24 | ||
4d9d951e JL |
25 | /* Init macro and function. */ |
26 | #define OSQ_LOCK_UNLOCKED { ATOMIC_INIT(OSQ_UNLOCKED_VAL) } | |
27 | ||
28 | static inline void osq_lock_init(struct optimistic_spin_queue *lock) | |
29 | { | |
30 | atomic_set(&lock->tail, OSQ_UNLOCKED_VAL); | |
31 | } | |
32 | ||
d84b6728 DB |
33 | extern bool osq_lock(struct optimistic_spin_queue *lock); |
34 | extern void osq_unlock(struct optimistic_spin_queue *lock); | |
35 | ||
59aabfc7 WL |
36 | static inline bool osq_is_locked(struct optimistic_spin_queue *lock) |
37 | { | |
38 | return atomic_read(&lock->tail) != OSQ_UNLOCKED_VAL; | |
39 | } | |
40 | ||
90631822 | 41 | #endif |