1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_DEBUG_LOCKING_H 3 #define __LINUX_DEBUG_LOCKING_H 4 5 #include <linux/kernel.h> 6 #include <linux/atomic.h> 7 #include <linux/bug.h> 8 9 struct task_struct; 10 11 extern int debug_locks __read_mostly; 12 extern int debug_locks_silent __read_mostly; 13 14 15 static __always_inline int __debug_locks_off(void) 16 { 17 return xchg(&debug_locks, 0); 18 } 19 20 /* 21 * Generic 'turn off all lock debugging' function: 22 */ 23 extern int debug_locks_off(void); 24 25 #define DEBUG_LOCKS_WARN_ON(c) \ 26 ({ \ 27 int __ret = 0; \ 28 \ 29 if (!oops_in_progress && unlikely(c)) { \ 30 if (debug_locks_off() && !debug_locks_silent) \ 31 WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c); \ 32 __ret = 1; \ 33 } \ 34 __ret; \ 35 }) 36 37 #ifdef CONFIG_SMP 38 # define SMP_DEBUG_LOCKS_WARN_ON(c) DEBUG_LOCKS_WARN_ON(c) 39 #else 40 # define SMP_DEBUG_LOCKS_WARN_ON(c) do { } while (0) 41 #endif 42 43 #ifdef CONFIG_DEBUG_LOCKING_API_SELFTESTS 44 extern void locking_selftest(void); 45 #else 46 # define locking_selftest() do { } while (0) 47 #endif 48 49 struct task_struct; 50 51 #ifdef CONFIG_LOCKDEP 52 extern void debug_show_all_locks(void); 53 extern void debug_show_held_locks(struct task_struct *task); 54 extern void debug_check_no_locks_freed(const void *from, unsigned long len); 55 extern void debug_check_no_locks_held(void); 56 #else 57 static inline void debug_show_all_locks(void) 58 { 59 } 60 61 static inline void debug_show_held_locks(struct task_struct *task) 62 { 63 } 64 65 static inline void 66 debug_check_no_locks_freed(const void *from, unsigned long len) 67 { 68 } 69 70 static inline void 71 debug_check_no_locks_held(void) 72 { 73 } 74 #endif 75 76 #endif 77