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