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