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 | ||
29 | static __always_inline bool rw_base_is_locked(struct rwbase_rt *rwb) | |
30 | { | |
31 | return atomic_read(&rwb->readers) != READER_BIAS; | |
32 | } | |
33 | ||
34 | static __always_inline bool rw_base_is_contended(struct rwbase_rt *rwb) | |
35 | { | |
36 | return atomic_read(&rwb->readers) > 0; | |
37 | } | |
38 | ||
39 | #endif /* _LINUX_RWBASE_RT_H */ |