1 // SPDX-License-Identifier: GPL-2.0-only
2 #ifndef __LINUX_SPINLOCK_RT_H
3 #define __LINUX_SPINLOCK_RT_H
5 #ifndef __LINUX_SPINLOCK_H
6 #error Do not include directly. Use spinlock.h
9 #ifdef CONFIG_DEBUG_LOCK_ALLOC
10 extern void __rt_spin_lock_init(spinlock_t *lock, const char *name,
11 struct lock_class_key *key, bool percpu);
13 static inline void __rt_spin_lock_init(spinlock_t *lock, const char *name,
14 struct lock_class_key *key, bool percpu)
19 #define spin_lock_init(slock) \
21 static struct lock_class_key __key; \
23 rt_mutex_base_init(&(slock)->lock); \
24 __rt_spin_lock_init(slock, #slock, &__key, false); \
27 #define local_spin_lock_init(slock) \
29 static struct lock_class_key __key; \
31 rt_mutex_base_init(&(slock)->lock); \
32 __rt_spin_lock_init(slock, #slock, &__key, true); \
35 extern void rt_spin_lock(spinlock_t *lock);
36 extern void rt_spin_lock_nested(spinlock_t *lock, int subclass);
37 extern void rt_spin_lock_nest_lock(spinlock_t *lock, struct lockdep_map *nest_lock);
38 extern void rt_spin_unlock(spinlock_t *lock);
39 extern void rt_spin_lock_unlock(spinlock_t *lock);
40 extern int rt_spin_trylock_bh(spinlock_t *lock);
41 extern int rt_spin_trylock(spinlock_t *lock);
43 static __always_inline void spin_lock(spinlock_t *lock)
49 # define __spin_lock_nested(lock, subclass) \
50 rt_spin_lock_nested(lock, subclass)
52 # define __spin_lock_nest_lock(lock, nest_lock) \
54 typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \
55 rt_spin_lock_nest_lock(lock, &(nest_lock)->dep_map); \
57 # define __spin_lock_irqsave_nested(lock, flags, subclass) \
59 typecheck(unsigned long, flags); \
61 __spin_lock_nested(lock, subclass); \
66 * Always evaluate the 'subclass' argument to avoid that the compiler
67 * warns about set-but-not-used variables when building with
68 * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
70 # define __spin_lock_nested(lock, subclass) spin_lock(((void)(subclass), (lock)))
71 # define __spin_lock_nest_lock(lock, subclass) spin_lock(((void)(subclass), (lock)))
72 # define __spin_lock_irqsave_nested(lock, flags, subclass) \
73 spin_lock_irqsave(((void)(subclass), (lock)), flags)
76 #define spin_lock_nested(lock, subclass) \
77 __spin_lock_nested(lock, subclass)
79 #define spin_lock_nest_lock(lock, nest_lock) \
80 __spin_lock_nest_lock(lock, nest_lock)
82 #define spin_lock_irqsave_nested(lock, flags, subclass) \
83 __spin_lock_irqsave_nested(lock, flags, subclass)
85 static __always_inline void spin_lock_bh(spinlock_t *lock)
87 /* Investigate: Drop bh when blocking ? */
92 static __always_inline void spin_lock_irq(spinlock_t *lock)
97 #define spin_lock_irqsave(lock, flags) \
99 typecheck(unsigned long, flags); \
104 static __always_inline void spin_unlock(spinlock_t *lock)
106 rt_spin_unlock(lock);
109 static __always_inline void spin_unlock_bh(spinlock_t *lock)
111 rt_spin_unlock(lock);
115 static __always_inline void spin_unlock_irq(spinlock_t *lock)
117 rt_spin_unlock(lock);
120 static __always_inline void spin_unlock_irqrestore(spinlock_t *lock,
123 rt_spin_unlock(lock);
126 #define spin_trylock(lock) \
127 __cond_lock(lock, rt_spin_trylock(lock))
129 #define spin_trylock_bh(lock) \
130 __cond_lock(lock, rt_spin_trylock_bh(lock))
132 #define spin_trylock_irq(lock) \
133 __cond_lock(lock, rt_spin_trylock(lock))
135 #define __spin_trylock_irqsave(lock, flags) \
139 typecheck(unsigned long, flags); \
141 __locked = spin_trylock(lock); \
145 #define spin_trylock_irqsave(lock, flags) \
146 __cond_lock(lock, __spin_trylock_irqsave(lock, flags))
148 #define spin_is_contended(lock) (((void)(lock), 0))
150 static inline int spin_is_locked(spinlock_t *lock)
152 return rt_mutex_base_is_locked(&lock->lock);
155 #define assert_spin_locked(lock) BUG_ON(!spin_is_locked(lock))
157 #include <linux/rwlock_rt.h>