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