1*9a11b49aSIngo Molnar #ifndef __LINUX_DEBUG_LOCKING_H 2*9a11b49aSIngo Molnar #define __LINUX_DEBUG_LOCKING_H 3*9a11b49aSIngo Molnar 4*9a11b49aSIngo Molnar extern int debug_locks; 5*9a11b49aSIngo Molnar extern int debug_locks_silent; 6*9a11b49aSIngo Molnar 7*9a11b49aSIngo Molnar /* 8*9a11b49aSIngo Molnar * Generic 'turn off all lock debugging' function: 9*9a11b49aSIngo Molnar */ 10*9a11b49aSIngo Molnar extern int debug_locks_off(void); 11*9a11b49aSIngo Molnar 12*9a11b49aSIngo Molnar /* 13*9a11b49aSIngo Molnar * In the debug case we carry the caller's instruction pointer into 14*9a11b49aSIngo Molnar * other functions, but we dont want the function argument overhead 15*9a11b49aSIngo Molnar * in the nondebug case - hence these macros: 16*9a11b49aSIngo Molnar */ 17*9a11b49aSIngo Molnar #define _RET_IP_ (unsigned long)__builtin_return_address(0) 18*9a11b49aSIngo Molnar #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) 19*9a11b49aSIngo Molnar 20*9a11b49aSIngo Molnar #define DEBUG_LOCKS_WARN_ON(c) \ 21*9a11b49aSIngo Molnar ({ \ 22*9a11b49aSIngo Molnar int __ret = 0; \ 23*9a11b49aSIngo Molnar \ 24*9a11b49aSIngo Molnar if (unlikely(c)) { \ 25*9a11b49aSIngo Molnar if (debug_locks_off()) \ 26*9a11b49aSIngo Molnar WARN_ON(1); \ 27*9a11b49aSIngo Molnar __ret = 1; \ 28*9a11b49aSIngo Molnar } \ 29*9a11b49aSIngo Molnar __ret; \ 30*9a11b49aSIngo Molnar }) 31*9a11b49aSIngo Molnar 32*9a11b49aSIngo Molnar #ifdef CONFIG_SMP 33*9a11b49aSIngo Molnar # define SMP_DEBUG_LOCKS_WARN_ON(c) DEBUG_LOCKS_WARN_ON(c) 34*9a11b49aSIngo Molnar #else 35*9a11b49aSIngo Molnar # define SMP_DEBUG_LOCKS_WARN_ON(c) do { } while (0) 36*9a11b49aSIngo Molnar #endif 37*9a11b49aSIngo Molnar 38*9a11b49aSIngo Molnar #ifdef CONFIG_DEBUG_LOCKING_API_SELFTESTS 39*9a11b49aSIngo Molnar extern void locking_selftest(void); 40*9a11b49aSIngo Molnar #else 41*9a11b49aSIngo Molnar # define locking_selftest() do { } while (0) 42*9a11b49aSIngo Molnar #endif 43*9a11b49aSIngo Molnar 44*9a11b49aSIngo Molnar #ifdef CONFIG_LOCKDEP 45*9a11b49aSIngo Molnar extern void debug_show_all_locks(void); 46*9a11b49aSIngo Molnar extern void debug_show_held_locks(struct task_struct *task); 47*9a11b49aSIngo Molnar extern void debug_check_no_locks_freed(const void *from, unsigned long len); 48*9a11b49aSIngo Molnar extern void debug_check_no_locks_held(struct task_struct *task); 49*9a11b49aSIngo Molnar #else 50*9a11b49aSIngo Molnar static inline void debug_show_all_locks(void) 51*9a11b49aSIngo Molnar { 52*9a11b49aSIngo Molnar } 53*9a11b49aSIngo Molnar 54*9a11b49aSIngo Molnar static inline void debug_show_held_locks(struct task_struct *task) 55*9a11b49aSIngo Molnar { 56*9a11b49aSIngo Molnar } 57*9a11b49aSIngo Molnar 58*9a11b49aSIngo Molnar static inline void 59*9a11b49aSIngo Molnar debug_check_no_locks_freed(const void *from, unsigned long len) 60*9a11b49aSIngo Molnar { 61*9a11b49aSIngo Molnar } 62*9a11b49aSIngo Molnar 63*9a11b49aSIngo Molnar static inline void 64*9a11b49aSIngo Molnar debug_check_no_locks_held(struct task_struct *task) 65*9a11b49aSIngo Molnar { 66*9a11b49aSIngo Molnar } 67*9a11b49aSIngo Molnar #endif 68*9a11b49aSIngo Molnar 69*9a11b49aSIngo Molnar #endif 70