linux/include/linux/rwlock_rt.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2#ifndef __LINUX_RWLOCK_RT_H
   3#define __LINUX_RWLOCK_RT_H
   4
   5#ifndef __LINUX_SPINLOCK_RT_H
   6#error Do not #include directly. Use <linux/spinlock.h>.
   7#endif
   8
   9#ifdef CONFIG_DEBUG_LOCK_ALLOC
  10extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name,
  11                             struct lock_class_key *key);
  12#else
  13static inline void __rt_rwlock_init(rwlock_t *rwlock, char *name,
  14                                    struct lock_class_key *key)
  15{
  16}
  17#endif
  18
  19#define rwlock_init(rwl)                                \
  20do {                                                    \
  21        static struct lock_class_key __key;             \
  22                                                        \
  23        init_rwbase_rt(&(rwl)->rwbase);                 \
  24        __rt_rwlock_init(rwl, #rwl, &__key);            \
  25} while (0)
  26
  27extern void rt_read_lock(rwlock_t *rwlock);
  28extern int rt_read_trylock(rwlock_t *rwlock);
  29extern void rt_read_unlock(rwlock_t *rwlock);
  30extern void rt_write_lock(rwlock_t *rwlock);
  31extern void rt_write_lock_nested(rwlock_t *rwlock, int subclass);
  32extern int rt_write_trylock(rwlock_t *rwlock);
  33extern void rt_write_unlock(rwlock_t *rwlock);
  34
  35static __always_inline void read_lock(rwlock_t *rwlock)
  36{
  37        rt_read_lock(rwlock);
  38}
  39
  40static __always_inline void read_lock_bh(rwlock_t *rwlock)
  41{
  42        local_bh_disable();
  43        rt_read_lock(rwlock);
  44}
  45
  46static __always_inline void read_lock_irq(rwlock_t *rwlock)
  47{
  48        rt_read_lock(rwlock);
  49}
  50
  51#define read_lock_irqsave(lock, flags)                  \
  52        do {                                            \
  53                typecheck(unsigned long, flags);        \
  54                rt_read_lock(lock);                     \
  55                flags = 0;                              \
  56        } while (0)
  57
  58#define read_trylock(lock)      __cond_lock(lock, rt_read_trylock(lock))
  59
  60static __always_inline void read_unlock(rwlock_t *rwlock)
  61{
  62        rt_read_unlock(rwlock);
  63}
  64
  65static __always_inline void read_unlock_bh(rwlock_t *rwlock)
  66{
  67        rt_read_unlock(rwlock);
  68        local_bh_enable();
  69}
  70
  71static __always_inline void read_unlock_irq(rwlock_t *rwlock)
  72{
  73        rt_read_unlock(rwlock);
  74}
  75
  76static __always_inline void read_unlock_irqrestore(rwlock_t *rwlock,
  77                                                   unsigned long flags)
  78{
  79        rt_read_unlock(rwlock);
  80}
  81
  82static __always_inline void write_lock(rwlock_t *rwlock)
  83{
  84        rt_write_lock(rwlock);
  85}
  86
  87#ifdef CONFIG_DEBUG_LOCK_ALLOC
  88static __always_inline void write_lock_nested(rwlock_t *rwlock, int subclass)
  89{
  90        rt_write_lock_nested(rwlock, subclass);
  91}
  92#else
  93#define write_lock_nested(lock, subclass)       rt_write_lock(((void)(subclass), (lock)))
  94#endif
  95
  96static __always_inline void write_lock_bh(rwlock_t *rwlock)
  97{
  98        local_bh_disable();
  99        rt_write_lock(rwlock);
 100}
 101
 102static __always_inline void write_lock_irq(rwlock_t *rwlock)
 103{
 104        rt_write_lock(rwlock);
 105}
 106
 107#define write_lock_irqsave(lock, flags)                 \
 108        do {                                            \
 109                typecheck(unsigned long, flags);        \
 110                rt_write_lock(lock);                    \
 111                flags = 0;                              \
 112        } while (0)
 113
 114#define write_trylock(lock)     __cond_lock(lock, rt_write_trylock(lock))
 115
 116#define write_trylock_irqsave(lock, flags)              \
 117({                                                      \
 118        int __locked;                                   \
 119                                                        \
 120        typecheck(unsigned long, flags);                \
 121        flags = 0;                                      \
 122        __locked = write_trylock(lock);                 \
 123        __locked;                                       \
 124})
 125
 126static __always_inline void write_unlock(rwlock_t *rwlock)
 127{
 128        rt_write_unlock(rwlock);
 129}
 130
 131static __always_inline void write_unlock_bh(rwlock_t *rwlock)
 132{
 133        rt_write_unlock(rwlock);
 134        local_bh_enable();
 135}
 136
 137static __always_inline void write_unlock_irq(rwlock_t *rwlock)
 138{
 139        rt_write_unlock(rwlock);
 140}
 141
 142static __always_inline void write_unlock_irqrestore(rwlock_t *rwlock,
 143                                                    unsigned long flags)
 144{
 145        rt_write_unlock(rwlock);
 146}
 147
 148#define rwlock_is_contended(lock)               (((void)(lock), 0))
 149
 150#endif /* __LINUX_RWLOCK_RT_H */
 151