xref: /linux/include/linux/debug_locks.h (revision 9a11b49a805665e13a56aa067afaf81d43ec1514)
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