xref: /linux/include/linux/local_lock.h (revision f694f30e81c4ade358eb8c75273bac1a48f0cb8f)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_LOCAL_LOCK_H
3 #define _LINUX_LOCAL_LOCK_H
4 
5 #include <linux/local_lock_internal.h>
6 
7 /**
8  * local_lock_init - Runtime initialize a lock instance
9  */
10 #define local_lock_init(lock)		__local_lock_init(lock)
11 
12 /**
13  * local_lock - Acquire a per CPU local lock
14  * @lock:	The lock variable
15  */
16 #define local_lock(lock)		__local_lock(lock)
17 
18 /**
19  * local_lock_irq - Acquire a per CPU local lock and disable interrupts
20  * @lock:	The lock variable
21  */
22 #define local_lock_irq(lock)		__local_lock_irq(lock)
23 
24 /**
25  * local_lock_irqsave - Acquire a per CPU local lock, save and disable
26  *			 interrupts
27  * @lock:	The lock variable
28  * @flags:	Storage for interrupt flags
29  */
30 #define local_lock_irqsave(lock, flags)				\
31 	__local_lock_irqsave(lock, flags)
32 
33 /**
34  * local_unlock - Release a per CPU local lock
35  * @lock:	The lock variable
36  */
37 #define local_unlock(lock)		__local_unlock(lock)
38 
39 /**
40  * local_unlock_irq - Release a per CPU local lock and enable interrupts
41  * @lock:	The lock variable
42  */
43 #define local_unlock_irq(lock)		__local_unlock_irq(lock)
44 
45 /**
46  * local_unlock_irqrestore - Release a per CPU local lock and restore
47  *			      interrupt flags
48  * @lock:	The lock variable
49  * @flags:      Interrupt flags to restore
50  */
51 #define local_unlock_irqrestore(lock, flags)			\
52 	__local_unlock_irqrestore(lock, flags)
53 
54 /**
55  * localtry_lock_init - Runtime initialize a lock instance
56  */
57 #define localtry_lock_init(lock)		__localtry_lock_init(lock)
58 
59 /**
60  * localtry_lock - Acquire a per CPU local lock
61  * @lock:	The lock variable
62  */
63 #define localtry_lock(lock)		__localtry_lock(lock)
64 
65 /**
66  * localtry_lock_irq - Acquire a per CPU local lock and disable interrupts
67  * @lock:	The lock variable
68  */
69 #define localtry_lock_irq(lock)		__localtry_lock_irq(lock)
70 
71 /**
72  * localtry_lock_irqsave - Acquire a per CPU local lock, save and disable
73  *			 interrupts
74  * @lock:	The lock variable
75  * @flags:	Storage for interrupt flags
76  */
77 #define localtry_lock_irqsave(lock, flags)				\
78 	__localtry_lock_irqsave(lock, flags)
79 
80 /**
81  * localtry_trylock - Try to acquire a per CPU local lock.
82  * @lock:	The lock variable
83  *
84  * The function can be used in any context such as NMI or HARDIRQ. Due to
85  * locking constrains it will _always_ fail to acquire the lock in NMI or
86  * HARDIRQ context on PREEMPT_RT.
87  */
88 #define localtry_trylock(lock)		__localtry_trylock(lock)
89 
90 /**
91  * localtry_trylock_irqsave - Try to acquire a per CPU local lock, save and disable
92  *			      interrupts if acquired
93  * @lock:	The lock variable
94  * @flags:	Storage for interrupt flags
95  *
96  * The function can be used in any context such as NMI or HARDIRQ. Due to
97  * locking constrains it will _always_ fail to acquire the lock in NMI or
98  * HARDIRQ context on PREEMPT_RT.
99  */
100 #define localtry_trylock_irqsave(lock, flags)				\
101 	__localtry_trylock_irqsave(lock, flags)
102 
103 /**
104  * local_unlock - Release a per CPU local lock
105  * @lock:	The lock variable
106  */
107 #define localtry_unlock(lock)		__localtry_unlock(lock)
108 
109 /**
110  * local_unlock_irq - Release a per CPU local lock and enable interrupts
111  * @lock:	The lock variable
112  */
113 #define localtry_unlock_irq(lock)		__localtry_unlock_irq(lock)
114 
115 /**
116  * localtry_unlock_irqrestore - Release a per CPU local lock and restore
117  *			      interrupt flags
118  * @lock:	The lock variable
119  * @flags:      Interrupt flags to restore
120  */
121 #define localtry_unlock_irqrestore(lock, flags)			\
122 	__localtry_unlock_irqrestore(lock, flags)
123 
124 DEFINE_GUARD(local_lock, local_lock_t __percpu*,
125 	     local_lock(_T),
126 	     local_unlock(_T))
127 DEFINE_GUARD(local_lock_irq, local_lock_t __percpu*,
128 	     local_lock_irq(_T),
129 	     local_unlock_irq(_T))
130 DEFINE_LOCK_GUARD_1(local_lock_irqsave, local_lock_t __percpu,
131 		    local_lock_irqsave(_T->lock, _T->flags),
132 		    local_unlock_irqrestore(_T->lock, _T->flags),
133 		    unsigned long flags)
134 
135 #define local_lock_nested_bh(_lock)				\
136 	__local_lock_nested_bh(_lock)
137 
138 #define local_unlock_nested_bh(_lock)				\
139 	__local_unlock_nested_bh(_lock)
140 
141 DEFINE_GUARD(local_lock_nested_bh, local_lock_t __percpu*,
142 	     local_lock_nested_bh(_T),
143 	     local_unlock_nested_bh(_T))
144 
145 #endif
146