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