Commit | Line | Data |
---|---|---|
943f0edb TG |
1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | #ifndef _LINUX_RWBASE_RT_H | |
3 | #define _LINUX_RWBASE_RT_H | |
4 | ||
5 | #include <linux/rtmutex.h> | |
6 | #include <linux/atomic.h> | |
7 | ||
8 | #define READER_BIAS (1U << 31) | |
9 | #define WRITER_BIAS (1U << 30) | |
10 | ||
11 | struct rwbase_rt { | |
12 | atomic_t readers; | |
13 | struct rt_mutex_base rtmutex; | |
14 | }; | |
15 | ||
16 | #define __RWBASE_INITIALIZER(name) \ | |
17 | { \ | |
18 | .readers = ATOMIC_INIT(READER_BIAS), \ | |
19 | .rtmutex = __RT_MUTEX_BASE_INITIALIZER(name.rtmutex), \ | |
20 | } | |
21 | ||
22 | #define init_rwbase_rt(rwbase) \ | |
23 | do { \ | |
24 | rt_mutex_base_init(&(rwbase)->rtmutex); \ | |
25 | atomic_set(&(rwbase)->readers, READER_BIAS); \ | |
26 | } while (0) | |
27 | ||
28 | ||
f70405af | 29 | static __always_inline bool rw_base_is_locked(const struct rwbase_rt *rwb) |
943f0edb TG |
30 | { |
31 | return atomic_read(&rwb->readers) != READER_BIAS; | |
32 | } | |
33 | ||
fa1f5116 | 34 | static __always_inline bool rw_base_is_write_locked(const struct rwbase_rt *rwb) |
f70405af | 35 | { |
fa1f5116 | 36 | return atomic_read(&rwb->readers) == WRITER_BIAS; |
f70405af MWO |
37 | } |
38 | ||
39 | static __always_inline bool rw_base_is_contended(const struct rwbase_rt *rwb) | |
943f0edb TG |
40 | { |
41 | return atomic_read(&rwb->readers) > 0; | |
42 | } | |
43 | ||
44 | #endif /* _LINUX_RWBASE_RT_H */ |