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(const struct rwbase_rt *rwb) 30 { 31 return atomic_read(&rwb->readers) != READER_BIAS; 32 } 33 34 static inline void rw_base_assert_held_write(const struct rwbase_rt *rwb) 35 { 36 WARN_ON(atomic_read(&rwb->readers) != WRITER_BIAS); 37 } 38 39 static __always_inline bool rw_base_is_contended(const struct rwbase_rt *rwb) 40 { 41 return atomic_read(&rwb->readers) > 0; 42 } 43 44 #endif /* _LINUX_RWBASE_RT_H */ 45