| From a943231c9d3d2e0cba7b3e4305b6717b713d2528 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 15 Aug 2021 23:27:37 +0200 |
| Subject: locking/local_lock: Add missing owner initialization |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| [ Upstream commit d8bbd97ad0b99a9394f2cd8410b884c48e218cf0 ] |
| |
| If CONFIG_DEBUG_LOCK_ALLOC=y is enabled then local_lock_t has an 'owner' |
| member which is checked for consistency, but nothing initialized it to |
| zero explicitly. |
| |
| The static initializer does so implicit, and the run time allocated per CPU |
| storage is usually zero initialized as well, but relying on that is not |
| really good practice. |
| |
| Fixes: 91710728d172 ("locking: Introduce local_lock()") |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Link: https://lore.kernel.org/r/20210815211301.969975279@linutronix.de |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/local_lock_internal.h | 42 ++++++++++++++++------------- |
| 1 file changed, 23 insertions(+), 19 deletions(-) |
| |
| diff --git a/include/linux/local_lock_internal.h b/include/linux/local_lock_internal.h |
| index ded90b097e6e..3f02b818625e 100644 |
| --- a/include/linux/local_lock_internal.h |
| +++ b/include/linux/local_lock_internal.h |
| @@ -14,29 +14,14 @@ typedef struct { |
| } local_lock_t; |
| |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| -# define LL_DEP_MAP_INIT(lockname) \ |
| +# define LOCAL_LOCK_DEBUG_INIT(lockname) \ |
| .dep_map = { \ |
| .name = #lockname, \ |
| .wait_type_inner = LD_WAIT_CONFIG, \ |
| - .lock_type = LD_LOCK_PERCPU, \ |
| - } |
| -#else |
| -# define LL_DEP_MAP_INIT(lockname) |
| -#endif |
| - |
| -#define INIT_LOCAL_LOCK(lockname) { LL_DEP_MAP_INIT(lockname) } |
| - |
| -#define __local_lock_init(lock) \ |
| -do { \ |
| - static struct lock_class_key __key; \ |
| - \ |
| - debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ |
| - lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, 0, \ |
| - LD_WAIT_CONFIG, LD_WAIT_INV, \ |
| - LD_LOCK_PERCPU); \ |
| -} while (0) |
| + .lock_type = LD_LOCK_PERCPU, \ |
| + }, \ |
| + .owner = NULL, |
| |
| -#ifdef CONFIG_DEBUG_LOCK_ALLOC |
| static inline void local_lock_acquire(local_lock_t *l) |
| { |
| lock_map_acquire(&l->dep_map); |
| @@ -51,11 +36,30 @@ static inline void local_lock_release(local_lock_t *l) |
| lock_map_release(&l->dep_map); |
| } |
| |
| +static inline void local_lock_debug_init(local_lock_t *l) |
| +{ |
| + l->owner = NULL; |
| +} |
| #else /* CONFIG_DEBUG_LOCK_ALLOC */ |
| +# define LOCAL_LOCK_DEBUG_INIT(lockname) |
| static inline void local_lock_acquire(local_lock_t *l) { } |
| static inline void local_lock_release(local_lock_t *l) { } |
| +static inline void local_lock_debug_init(local_lock_t *l) { } |
| #endif /* !CONFIG_DEBUG_LOCK_ALLOC */ |
| |
| +#define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } |
| + |
| +#define __local_lock_init(lock) \ |
| +do { \ |
| + static struct lock_class_key __key; \ |
| + \ |
| + debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ |
| + lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, \ |
| + 0, LD_WAIT_CONFIG, LD_WAIT_INV, \ |
| + LD_LOCK_PERCPU); \ |
| + local_lock_debug_init(lock); \ |
| +} while (0) |
| + |
| #define __local_lock(lock) \ |
| do { \ |
| preempt_disable(); \ |
| -- |
| 2.30.2 |
| |