1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_LOCAL_LOCK_H
3 # error "Do not include directly, include linux/local_lock.h"
6 #include <linux/percpu-defs.h>
7 #include <linux/lockdep.h>
10 #ifdef CONFIG_DEBUG_LOCK_ALLOC
11 struct lockdep_map dep_map;
12 struct task_struct *owner;
16 #ifdef CONFIG_DEBUG_LOCK_ALLOC
17 # define LOCAL_LOCK_DEBUG_INIT(lockname) \
20 .wait_type_inner = LD_WAIT_CONFIG, \
21 .lock_type = LD_LOCK_PERCPU, \
25 static inline void local_lock_acquire(local_lock_t *l)
27 lock_map_acquire(&l->dep_map);
28 DEBUG_LOCKS_WARN_ON(l->owner);
32 static inline void local_lock_release(local_lock_t *l)
34 DEBUG_LOCKS_WARN_ON(l->owner != current);
36 lock_map_release(&l->dep_map);
39 static inline void local_lock_debug_init(local_lock_t *l)
43 #else /* CONFIG_DEBUG_LOCK_ALLOC */
44 # define LOCAL_LOCK_DEBUG_INIT(lockname)
45 static inline void local_lock_acquire(local_lock_t *l) { }
46 static inline void local_lock_release(local_lock_t *l) { }
47 static inline void local_lock_debug_init(local_lock_t *l) { }
48 #endif /* !CONFIG_DEBUG_LOCK_ALLOC */
50 #define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) }
52 #define __local_lock_init(lock) \
54 static struct lock_class_key __key; \
56 debug_check_no_locks_freed((void *)lock, sizeof(*lock));\
57 lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, \
58 0, LD_WAIT_CONFIG, LD_WAIT_INV, \
60 local_lock_debug_init(lock); \
63 #define __local_lock(lock) \
66 local_lock_acquire(this_cpu_ptr(lock)); \
69 #define __local_lock_irq(lock) \
71 local_irq_disable(); \
72 local_lock_acquire(this_cpu_ptr(lock)); \
75 #define __local_lock_irqsave(lock, flags) \
77 local_irq_save(flags); \
78 local_lock_acquire(this_cpu_ptr(lock)); \
81 #define __local_unlock(lock) \
83 local_lock_release(this_cpu_ptr(lock)); \
87 #define __local_unlock_irq(lock) \
89 local_lock_release(this_cpu_ptr(lock)); \
93 #define __local_unlock_irqrestore(lock, flags) \
95 local_lock_release(this_cpu_ptr(lock)); \
96 local_irq_restore(flags); \