| // SPDX-License-Identifier: GPL-2.0-only | |
| #ifndef __LINUX_RWLOCK_RT_H | |
| #define __LINUX_RWLOCK_RT_H | |
| #ifndef __LINUX_SPINLOCK_RT_H | |
| #error Do not #include directly. Use <linux/spinlock.h>. | |
| #endif | |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC | |
| extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name, | |
| struct lock_class_key *key); | |
| #else | |
| static inline void __rt_rwlock_init(rwlock_t *rwlock, char *name, | |
| struct lock_class_key *key) | |
| { | |
| } | |
| #endif | |
| #define rwlock_init(rwl) \ | |
| do { \ | |
| static struct lock_class_key __key; \ | |
| \ | |
| init_rwbase_rt(&(rwl)->rwbase); \ | |
| __rt_rwlock_init(rwl, #rwl, &__key); \ | |
| } while (0) | |
| extern void rt_read_lock(rwlock_t *rwlock); | |
| extern int rt_read_trylock(rwlock_t *rwlock); | |
| extern void rt_read_unlock(rwlock_t *rwlock); | |
| extern void rt_write_lock(rwlock_t *rwlock); | |
| extern void rt_write_lock_nested(rwlock_t *rwlock, int subclass); | |
| extern int rt_write_trylock(rwlock_t *rwlock); | |
| extern void rt_write_unlock(rwlock_t *rwlock); | |
| static __always_inline void read_lock(rwlock_t *rwlock) | |
| { | |
| rt_read_lock(rwlock); | |
| } | |
| static __always_inline void read_lock_bh(rwlock_t *rwlock) | |
| { | |
| local_bh_disable(); | |
| rt_read_lock(rwlock); | |
| } | |
| static __always_inline void read_lock_irq(rwlock_t *rwlock) | |
| { | |
| rt_read_lock(rwlock); | |
| } | |
| #define read_lock_irqsave(lock, flags) \ | |
| do { \ | |
| typecheck(unsigned long, flags); \ | |
| rt_read_lock(lock); \ | |
| flags = 0; \ | |
| } while (0) | |
| #define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) | |
| static __always_inline void read_unlock(rwlock_t *rwlock) | |
| { | |
| rt_read_unlock(rwlock); | |
| } | |
| static __always_inline void read_unlock_bh(rwlock_t *rwlock) | |
| { | |
| rt_read_unlock(rwlock); | |
| local_bh_enable(); | |
| } | |
| static __always_inline void read_unlock_irq(rwlock_t *rwlock) | |
| { | |
| rt_read_unlock(rwlock); | |
| } | |
| static __always_inline void read_unlock_irqrestore(rwlock_t *rwlock, | |
| unsigned long flags) | |
| { | |
| rt_read_unlock(rwlock); | |
| } | |
| static __always_inline void write_lock(rwlock_t *rwlock) | |
| { | |
| rt_write_lock(rwlock); | |
| } | |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC | |
| static __always_inline void write_lock_nested(rwlock_t *rwlock, int subclass) | |
| { | |
| rt_write_lock_nested(rwlock, subclass); | |
| } | |
| #else | |
| #define write_lock_nested(lock, subclass) rt_write_lock(((void)(subclass), (lock))) | |
| #endif | |
| static __always_inline void write_lock_bh(rwlock_t *rwlock) | |
| { | |
| local_bh_disable(); | |
| rt_write_lock(rwlock); | |
| } | |
| static __always_inline void write_lock_irq(rwlock_t *rwlock) | |
| { | |
| rt_write_lock(rwlock); | |
| } | |
| #define write_lock_irqsave(lock, flags) \ | |
| do { \ | |
| typecheck(unsigned long, flags); \ | |
| rt_write_lock(lock); \ | |
| flags = 0; \ | |
| } while (0) | |
| #define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) | |
| #define write_trylock_irqsave(lock, flags) \ | |
| ({ \ | |
| int __locked; \ | |
| \ | |
| typecheck(unsigned long, flags); \ | |
| flags = 0; \ | |
| __locked = write_trylock(lock); \ | |
| __locked; \ | |
| }) | |
| static __always_inline void write_unlock(rwlock_t *rwlock) | |
| { | |
| rt_write_unlock(rwlock); | |
| } | |
| static __always_inline void write_unlock_bh(rwlock_t *rwlock) | |
| { | |
| rt_write_unlock(rwlock); | |
| local_bh_enable(); | |
| } | |
| static __always_inline void write_unlock_irq(rwlock_t *rwlock) | |
| { | |
| rt_write_unlock(rwlock); | |
| } | |
| static __always_inline void write_unlock_irqrestore(rwlock_t *rwlock, | |
| unsigned long flags) | |
| { | |
| rt_write_unlock(rwlock); | |
| } | |
| #define rwlock_is_contended(lock) (((void)(lock), 0)) | |
| #endif /* __LINUX_RWLOCK_RT_H */ |