xref: /linux-6.15/include/linux/local_lock.h (revision 51339d99)
191710728SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0 */
291710728SThomas Gleixner #ifndef _LINUX_LOCAL_LOCK_H
391710728SThomas Gleixner #define _LINUX_LOCAL_LOCK_H
491710728SThomas Gleixner 
591710728SThomas Gleixner #include <linux/local_lock_internal.h>
691710728SThomas Gleixner 
791710728SThomas Gleixner /**
891710728SThomas Gleixner  * local_lock_init - Runtime initialize a lock instance
991710728SThomas Gleixner  */
1091710728SThomas Gleixner #define local_lock_init(lock)		__local_lock_init(lock)
1191710728SThomas Gleixner 
1291710728SThomas Gleixner /**
1391710728SThomas Gleixner  * local_lock - Acquire a per CPU local lock
1491710728SThomas Gleixner  * @lock:	The lock variable
1591710728SThomas Gleixner  */
1691710728SThomas Gleixner #define local_lock(lock)		__local_lock(lock)
1791710728SThomas Gleixner 
1891710728SThomas Gleixner /**
1991710728SThomas Gleixner  * local_lock_irq - Acquire a per CPU local lock and disable interrupts
2091710728SThomas Gleixner  * @lock:	The lock variable
2191710728SThomas Gleixner  */
2291710728SThomas Gleixner #define local_lock_irq(lock)		__local_lock_irq(lock)
2391710728SThomas Gleixner 
2491710728SThomas Gleixner /**
2591710728SThomas Gleixner  * local_lock_irqsave - Acquire a per CPU local lock, save and disable
2691710728SThomas Gleixner  *			 interrupts
2791710728SThomas Gleixner  * @lock:	The lock variable
2891710728SThomas Gleixner  * @flags:	Storage for interrupt flags
2991710728SThomas Gleixner  */
3091710728SThomas Gleixner #define local_lock_irqsave(lock, flags)				\
3191710728SThomas Gleixner 	__local_lock_irqsave(lock, flags)
3291710728SThomas Gleixner 
3391710728SThomas Gleixner /**
3491710728SThomas Gleixner  * local_unlock - Release a per CPU local lock
3591710728SThomas Gleixner  * @lock:	The lock variable
3691710728SThomas Gleixner  */
3791710728SThomas Gleixner #define local_unlock(lock)		__local_unlock(lock)
3891710728SThomas Gleixner 
3991710728SThomas Gleixner /**
4091710728SThomas Gleixner  * local_unlock_irq - Release a per CPU local lock and enable interrupts
4191710728SThomas Gleixner  * @lock:	The lock variable
4291710728SThomas Gleixner  */
4391710728SThomas Gleixner #define local_unlock_irq(lock)		__local_unlock_irq(lock)
4491710728SThomas Gleixner 
4591710728SThomas Gleixner /**
4691710728SThomas Gleixner  * local_unlock_irqrestore - Release a per CPU local lock and restore
4791710728SThomas Gleixner  *			      interrupt flags
4891710728SThomas Gleixner  * @lock:	The lock variable
4991710728SThomas Gleixner  * @flags:      Interrupt flags to restore
5091710728SThomas Gleixner  */
5191710728SThomas Gleixner #define local_unlock_irqrestore(lock, flags)			\
5291710728SThomas Gleixner 	__local_unlock_irqrestore(lock, flags)
5391710728SThomas Gleixner 
540aaddfb0SSebastian Andrzej Siewior /**
55*51339d99SAlexei Starovoitov  * local_lock_init - Runtime initialize a lock instance
560aaddfb0SSebastian Andrzej Siewior  */
57*51339d99SAlexei Starovoitov #define local_trylock_init(lock)	__local_trylock_init(lock)
580aaddfb0SSebastian Andrzej Siewior 
590aaddfb0SSebastian Andrzej Siewior /**
60*51339d99SAlexei Starovoitov  * local_trylock - Try to acquire a per CPU local lock
610aaddfb0SSebastian Andrzej Siewior  * @lock:	The lock variable
620aaddfb0SSebastian Andrzej Siewior  *
630aaddfb0SSebastian Andrzej Siewior  * The function can be used in any context such as NMI or HARDIRQ. Due to
640aaddfb0SSebastian Andrzej Siewior  * locking constrains it will _always_ fail to acquire the lock in NMI or
650aaddfb0SSebastian Andrzej Siewior  * HARDIRQ context on PREEMPT_RT.
660aaddfb0SSebastian Andrzej Siewior  */
67*51339d99SAlexei Starovoitov #define local_trylock(lock)		__local_trylock(lock)
680aaddfb0SSebastian Andrzej Siewior 
690aaddfb0SSebastian Andrzej Siewior /**
70*51339d99SAlexei Starovoitov  * local_trylock_irqsave - Try to acquire a per CPU local lock, save and disable
710aaddfb0SSebastian Andrzej Siewior  *			   interrupts if acquired
720aaddfb0SSebastian Andrzej Siewior  * @lock:	The lock variable
730aaddfb0SSebastian Andrzej Siewior  * @flags:	Storage for interrupt flags
740aaddfb0SSebastian Andrzej Siewior  *
750aaddfb0SSebastian Andrzej Siewior  * The function can be used in any context such as NMI or HARDIRQ. Due to
760aaddfb0SSebastian Andrzej Siewior  * locking constrains it will _always_ fail to acquire the lock in NMI or
770aaddfb0SSebastian Andrzej Siewior  * HARDIRQ context on PREEMPT_RT.
780aaddfb0SSebastian Andrzej Siewior  */
79*51339d99SAlexei Starovoitov #define local_trylock_irqsave(lock, flags)			\
80*51339d99SAlexei Starovoitov 	__local_trylock_irqsave(lock, flags)
810aaddfb0SSebastian Andrzej Siewior 
8207e4fd4cSSebastian Andrzej Siewior DEFINE_GUARD(local_lock, local_lock_t __percpu*,
8307e4fd4cSSebastian Andrzej Siewior 	     local_lock(_T),
8407e4fd4cSSebastian Andrzej Siewior 	     local_unlock(_T))
8507e4fd4cSSebastian Andrzej Siewior DEFINE_GUARD(local_lock_irq, local_lock_t __percpu*,
8607e4fd4cSSebastian Andrzej Siewior 	     local_lock_irq(_T),
8707e4fd4cSSebastian Andrzej Siewior 	     local_unlock_irq(_T))
8807e4fd4cSSebastian Andrzej Siewior DEFINE_LOCK_GUARD_1(local_lock_irqsave, local_lock_t __percpu,
8907e4fd4cSSebastian Andrzej Siewior 		    local_lock_irqsave(_T->lock, _T->flags),
9007e4fd4cSSebastian Andrzej Siewior 		    local_unlock_irqrestore(_T->lock, _T->flags),
9107e4fd4cSSebastian Andrzej Siewior 		    unsigned long flags)
9207e4fd4cSSebastian Andrzej Siewior 
93c5bcab75SSebastian Andrzej Siewior #define local_lock_nested_bh(_lock)				\
94c5bcab75SSebastian Andrzej Siewior 	__local_lock_nested_bh(_lock)
95c5bcab75SSebastian Andrzej Siewior 
96c5bcab75SSebastian Andrzej Siewior #define local_unlock_nested_bh(_lock)				\
97c5bcab75SSebastian Andrzej Siewior 	__local_unlock_nested_bh(_lock)
98c5bcab75SSebastian Andrzej Siewior 
99c5bcab75SSebastian Andrzej Siewior DEFINE_GUARD(local_lock_nested_bh, local_lock_t __percpu*,
100c5bcab75SSebastian Andrzej Siewior 	     local_lock_nested_bh(_T),
101c5bcab75SSebastian Andrzej Siewior 	     local_unlock_nested_bh(_T))
102c5bcab75SSebastian Andrzej Siewior 
10391710728SThomas Gleixner #endif
104