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