xref: /linux/include/linux/local_lock.h (revision 6f7e6393d1ce636bb7ec77a7fe7b77458fddf701)
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  * @lock:	The lock variable
10  */
11 #define local_lock_init(lock)		__local_lock_init(lock)
12 
13 /**
14  * local_lock - Acquire a per CPU local lock
15  * @lock:	The lock variable
16  */
17 #define local_lock(lock)		__local_lock(__this_cpu_local_lock(lock))
18 
19 /**
20  * local_lock_irq - Acquire a per CPU local lock and disable interrupts
21  * @lock:	The lock variable
22  */
23 #define local_lock_irq(lock)		__local_lock_irq(__this_cpu_local_lock(lock))
24 
25 /**
26  * local_lock_irqsave - Acquire a per CPU local lock, save and disable
27  *			 interrupts
28  * @lock:	The lock variable
29  * @flags:	Storage for interrupt flags
30  */
31 #define local_lock_irqsave(lock, flags)				\
32 	__local_lock_irqsave(__this_cpu_local_lock(lock), flags)
33 
34 /**
35  * local_unlock - Release a per CPU local lock
36  * @lock:	The lock variable
37  */
38 #define local_unlock(lock)		__local_unlock(__this_cpu_local_lock(lock))
39 
40 /**
41  * local_unlock_irq - Release a per CPU local lock and enable interrupts
42  * @lock:	The lock variable
43  */
44 #define local_unlock_irq(lock)		__local_unlock_irq(__this_cpu_local_lock(lock))
45 
46 /**
47  * local_unlock_irqrestore - Release a per CPU local lock and restore
48  *			      interrupt flags
49  * @lock:	The lock variable
50  * @flags:      Interrupt flags to restore
51  */
52 #define local_unlock_irqrestore(lock, flags)			\
53 	__local_unlock_irqrestore(__this_cpu_local_lock(lock), flags)
54 
55 /**
56  * local_trylock_init - Runtime initialize a lock instance
57  * @lock:	The lock variable
58  */
59 #define local_trylock_init(lock)	__local_trylock_init(lock)
60 
61 /**
62  * local_trylock - Try to acquire a per CPU local lock
63  * @lock:	The lock variable
64  *
65  * The function can be used in any context such as NMI or HARDIRQ. Due to
66  * locking constrains it will _always_ fail to acquire the lock in NMI or
67  * HARDIRQ context on PREEMPT_RT.
68  */
69 #define local_trylock(lock)		__local_trylock(__this_cpu_local_lock(lock))
70 
71 #define local_lock_is_locked(lock)	__local_lock_is_locked(lock)
72 
73 /**
74  * local_trylock_irqsave - Try to acquire a per CPU local lock, save and disable
75  *			   interrupts if acquired
76  * @lock:	The lock variable
77  * @flags:	Storage for interrupt flags
78  *
79  * The function can be used in any context such as NMI or HARDIRQ. Due to
80  * locking constrains it will _always_ fail to acquire the lock in NMI or
81  * HARDIRQ context on PREEMPT_RT.
82  */
83 #define local_trylock_irqsave(lock, flags)			\
84 	__local_trylock_irqsave(__this_cpu_local_lock(lock), flags)
85 
86 DEFINE_LOCK_GUARD_1(local_lock, local_lock_t __percpu,
87 		    local_lock(_T->lock),
88 		    local_unlock(_T->lock))
89 DEFINE_LOCK_GUARD_1(local_lock_irq, local_lock_t __percpu,
90 		    local_lock_irq(_T->lock),
91 		    local_unlock_irq(_T->lock))
92 DEFINE_LOCK_GUARD_1(local_lock_irqsave, local_lock_t __percpu,
93 		    local_lock_irqsave(_T->lock, _T->flags),
94 		    local_unlock_irqrestore(_T->lock, _T->flags),
95 		    unsigned long flags)
96 
97 #define local_lock_nested_bh(_lock)				\
98 	__local_lock_nested_bh(__this_cpu_local_lock(_lock))
99 
100 #define local_unlock_nested_bh(_lock)				\
101 	__local_unlock_nested_bh(__this_cpu_local_lock(_lock))
102 
103 DEFINE_LOCK_GUARD_1(local_lock_nested_bh, local_lock_t __percpu,
104 		    local_lock_nested_bh(_T->lock),
105 		    local_unlock_nested_bh(_T->lock))
106 
107 DEFINE_LOCK_GUARD_1(local_lock_init, local_lock_t, local_lock_init(_T->lock), /* */)
108 
109 DECLARE_LOCK_GUARD_1_ATTRS(local_lock, __acquires(_T), __releases(*(local_lock_t __percpu **)_T))
110 #define class_local_lock_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_lock, _T)
111 DECLARE_LOCK_GUARD_1_ATTRS(local_lock_irq, __acquires(_T), __releases(*(local_lock_t __percpu **)_T))
112 #define class_local_lock_irq_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_lock_irq, _T)
113 DECLARE_LOCK_GUARD_1_ATTRS(local_lock_irqsave, __acquires(_T), __releases(*(local_lock_t __percpu **)_T))
114 #define class_local_lock_irqsave_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_lock_irqsave, _T)
115 DECLARE_LOCK_GUARD_1_ATTRS(local_lock_nested_bh, __acquires(_T), __releases(*(local_lock_t __percpu **)_T))
116 #define class_local_lock_nested_bh_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_lock_nested_bh, _T)
117 DECLARE_LOCK_GUARD_1_ATTRS(local_lock_init, __acquires(_T), __releases(*(local_lock_t **)_T))
118 #define class_local_lock_init_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_lock_init, _T)
119 
120 DEFINE_LOCK_GUARD_1(local_trylock_init, local_trylock_t, local_trylock_init(_T->lock), /* */)
121 DECLARE_LOCK_GUARD_1_ATTRS(local_trylock_init, __acquires(_T), __releases(*(local_trylock_t **)_T))
122 #define class_local_trylock_init_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(local_trylock_init, _T)
123 
124 #endif
125