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