Messages in this thread Patch in this message | | | From | "Matthew Wilcox (Oracle)" <> | Subject | [PATCH 17/17] bit_spinlock: Track bit spin locks with lockdep | Date | Fri, 9 Apr 2021 03:51:31 +0100 |
| |
Now that all users have been converted, require the split_lock parameter be passed to bit_spin_lock(), bit_spin_unlock() and variants. Use it to track the lockdep state of each lock.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- include/linux/bit_spinlock.h | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/include/linux/bit_spinlock.h b/include/linux/bit_spinlock.h index 6c5bbb55b334..a02ce695198a 100644 --- a/include/linux/bit_spinlock.h +++ b/include/linux/bit_spinlock.h @@ -34,30 +34,21 @@ static inline void bit_spin_lock_nested(int bitnum, unsigned long *addr, preempt_disable(); } #endif + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); __acquire(bitlock); } static inline void bit_spin_lock(int bitnum, unsigned long *addr, - ...) + struct split_lock *lock) { - preempt_disable(); -#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) - while (unlikely(test_and_set_bit_lock(bitnum, addr))) { - preempt_enable(); - do { - cpu_relax(); - } while (test_bit(bitnum, addr)); - preempt_disable(); - } -#endif - __acquire(bitlock); + bit_spin_lock_nested(bitnum, addr, lock, 0); } /* * Return true if it was acquired */ static inline int bit_spin_trylock(int bitnum, unsigned long *addr, - ...) + struct split_lock *lock) { preempt_disable(); #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) @@ -66,6 +57,7 @@ static inline int bit_spin_trylock(int bitnum, unsigned long *addr, return 0; } #endif + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); __acquire(bitlock); return 1; } @@ -74,11 +66,12 @@ static inline int bit_spin_trylock(int bitnum, unsigned long *addr, * bit-based spin_unlock() */ static inline void bit_spin_unlock(int bitnum, unsigned long *addr, - ...) + struct split_lock *lock) { #ifdef CONFIG_DEBUG_SPINLOCK BUG_ON(!test_bit(bitnum, addr)); #endif + spin_release(&lock->dep_map, _RET_IP_); #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) clear_bit_unlock(bitnum, addr); #endif @@ -92,11 +85,12 @@ static inline void bit_spin_unlock(int bitnum, unsigned long *addr, * protecting the rest of the flags in the word. */ static inline void __bit_spin_unlock(int bitnum, unsigned long *addr, - ...) + struct split_lock *lock) { #ifdef CONFIG_DEBUG_SPINLOCK BUG_ON(!test_bit(bitnum, addr)); #endif + spin_release(&lock->dep_map, _RET_IP_); #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) __clear_bit_unlock(bitnum, addr); #endif @@ -113,6 +107,7 @@ static inline void __bit_spin_unlock(int bitnum, unsigned long *addr, static inline void bit_spin_unlock_assign(unsigned long *addr, unsigned long val, struct split_lock *lock) { + spin_release(&lock->dep_map, _RET_IP_); smp_store_release(addr, val); preempt_enable(); __release(bitlock); @@ -133,4 +128,3 @@ static inline int bit_spin_is_locked(int bitnum, unsigned long *addr) } #endif /* __LINUX_BIT_SPINLOCK_H */ - -- 2.30.2
| |