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