1 // SPDX-License-Identifier: GPL-2.0-only
2 #ifndef __LINUX_RWLOCK_RT_H
3 #define __LINUX_RWLOCK_RT_H
5 #ifndef __LINUX_SPINLOCK_RT_H
6 #error Do not #include directly. Use <linux/spinlock.h>.
9 #ifdef CONFIG_DEBUG_LOCK_ALLOC
10 extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name,
11 struct lock_class_key *key);
13 static inline void __rt_rwlock_init(rwlock_t *rwlock, char *name,
14 struct lock_class_key *key)
19 #define rwlock_init(rwl) \
21 static struct lock_class_key __key; \
23 init_rwbase_rt(&(rwl)->rwbase); \
24 __rt_rwlock_init(rwl, #rwl, &__key); \
27 extern void rt_read_lock(rwlock_t *rwlock);
28 extern int rt_read_trylock(rwlock_t *rwlock);
29 extern void rt_read_unlock(rwlock_t *rwlock);
30 extern void rt_write_lock(rwlock_t *rwlock);
31 extern int rt_write_trylock(rwlock_t *rwlock);
32 extern void rt_write_unlock(rwlock_t *rwlock);
34 static __always_inline void read_lock(rwlock_t *rwlock)
39 static __always_inline void read_lock_bh(rwlock_t *rwlock)
45 static __always_inline void read_lock_irq(rwlock_t *rwlock)
50 #define read_lock_irqsave(lock, flags) \
52 typecheck(unsigned long, flags); \
57 #define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock))
59 static __always_inline void read_unlock(rwlock_t *rwlock)
61 rt_read_unlock(rwlock);
64 static __always_inline void read_unlock_bh(rwlock_t *rwlock)
66 rt_read_unlock(rwlock);
70 static __always_inline void read_unlock_irq(rwlock_t *rwlock)
72 rt_read_unlock(rwlock);
75 static __always_inline void read_unlock_irqrestore(rwlock_t *rwlock,
78 rt_read_unlock(rwlock);
81 static __always_inline void write_lock(rwlock_t *rwlock)
83 rt_write_lock(rwlock);
86 static __always_inline void write_lock_bh(rwlock_t *rwlock)
89 rt_write_lock(rwlock);
92 static __always_inline void write_lock_irq(rwlock_t *rwlock)
94 rt_write_lock(rwlock);
97 #define write_lock_irqsave(lock, flags) \
99 typecheck(unsigned long, flags); \
100 rt_write_lock(lock); \
104 #define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock))
106 #define write_trylock_irqsave(lock, flags) \
110 typecheck(unsigned long, flags); \
112 __locked = write_trylock(lock); \
116 static __always_inline void write_unlock(rwlock_t *rwlock)
118 rt_write_unlock(rwlock);
121 static __always_inline void write_unlock_bh(rwlock_t *rwlock)
123 rt_write_unlock(rwlock);
127 static __always_inline void write_unlock_irq(rwlock_t *rwlock)
129 rt_write_unlock(rwlock);
132 static __always_inline void write_unlock_irqrestore(rwlock_t *rwlock,
135 rt_write_unlock(rwlock);
138 #define rwlock_is_contended(lock) (((void)(lock), 0))
140 #endif /* __LINUX_RWLOCK_RT_H */