• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
10 extern void __rt_rwlock_init(rwlock_t *rwlock, const char *name,
11 			     struct lock_class_key *key);
12 #else
__rt_rwlock_init(rwlock_t * rwlock,char * name,struct lock_class_key * key)13 static 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)				\
20 do {							\
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 
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);
33 
read_lock(rwlock_t * rwlock)34 static __always_inline void read_lock(rwlock_t *rwlock)
35 {
36 	rt_read_lock(rwlock);
37 }
38 
read_lock_bh(rwlock_t * rwlock)39 static __always_inline void read_lock_bh(rwlock_t *rwlock)
40 {
41 	local_bh_disable();
42 	rt_read_lock(rwlock);
43 }
44 
read_lock_irq(rwlock_t * rwlock)45 static __always_inline void read_lock_irq(rwlock_t *rwlock)
46 {
47 	rt_read_lock(rwlock);
48 }
49 
50 #define read_lock_irqsave(lock, flags)			\
51 	do {						\
52 		typecheck(unsigned long, flags);	\
53 		rt_read_lock(lock);			\
54 		flags = 0;				\
55 	} while (0)
56 
57 #define read_trylock(lock)	__cond_lock(lock, rt_read_trylock(lock))
58 
read_unlock(rwlock_t * rwlock)59 static __always_inline void read_unlock(rwlock_t *rwlock)
60 {
61 	rt_read_unlock(rwlock);
62 }
63 
read_unlock_bh(rwlock_t * rwlock)64 static __always_inline void read_unlock_bh(rwlock_t *rwlock)
65 {
66 	rt_read_unlock(rwlock);
67 	local_bh_enable();
68 }
69 
read_unlock_irq(rwlock_t * rwlock)70 static __always_inline void read_unlock_irq(rwlock_t *rwlock)
71 {
72 	rt_read_unlock(rwlock);
73 }
74 
read_unlock_irqrestore(rwlock_t * rwlock,unsigned long flags)75 static __always_inline void read_unlock_irqrestore(rwlock_t *rwlock,
76 						   unsigned long flags)
77 {
78 	rt_read_unlock(rwlock);
79 }
80 
write_lock(rwlock_t * rwlock)81 static __always_inline void write_lock(rwlock_t *rwlock)
82 {
83 	rt_write_lock(rwlock);
84 }
85 
write_lock_bh(rwlock_t * rwlock)86 static __always_inline void write_lock_bh(rwlock_t *rwlock)
87 {
88 	local_bh_disable();
89 	rt_write_lock(rwlock);
90 }
91 
write_lock_irq(rwlock_t * rwlock)92 static __always_inline void write_lock_irq(rwlock_t *rwlock)
93 {
94 	rt_write_lock(rwlock);
95 }
96 
97 #define write_lock_irqsave(lock, flags)			\
98 	do {						\
99 		typecheck(unsigned long, flags);	\
100 		rt_write_lock(lock);			\
101 		flags = 0;				\
102 	} while (0)
103 
104 #define write_trylock(lock)	__cond_lock(lock, rt_write_trylock(lock))
105 
106 #define write_trylock_irqsave(lock, flags)		\
107 ({							\
108 	int __locked;					\
109 							\
110 	typecheck(unsigned long, flags);		\
111 	flags = 0;					\
112 	__locked = write_trylock(lock);			\
113 	__locked;					\
114 })
115 
write_unlock(rwlock_t * rwlock)116 static __always_inline void write_unlock(rwlock_t *rwlock)
117 {
118 	rt_write_unlock(rwlock);
119 }
120 
write_unlock_bh(rwlock_t * rwlock)121 static __always_inline void write_unlock_bh(rwlock_t *rwlock)
122 {
123 	rt_write_unlock(rwlock);
124 	local_bh_enable();
125 }
126 
write_unlock_irq(rwlock_t * rwlock)127 static __always_inline void write_unlock_irq(rwlock_t *rwlock)
128 {
129 	rt_write_unlock(rwlock);
130 }
131 
write_unlock_irqrestore(rwlock_t * rwlock,unsigned long flags)132 static __always_inline void write_unlock_irqrestore(rwlock_t *rwlock,
133 						    unsigned long flags)
134 {
135 	rt_write_unlock(rwlock);
136 }
137 
138 #define rwlock_is_contended(lock)		(((void)(lock), 0))
139 
140 #endif /* __LINUX_RWLOCK_RT_H */
141