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