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