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