blob: 822c1354f3a69dae20e7f6cacaf340b40ea9d7c4 [file] [log] [blame]
Ingo Molnar9a11b49a2006-07-03 00:24:33 -07001#ifndef __LINUX_DEBUG_LOCKING_H
2#define __LINUX_DEBUG_LOCKING_H
3
Eduard - Gabriel Munteanuca31e142008-07-05 12:14:23 +03004#include <linux/kernel.h>
Arun Sharma600634972011-07-26 16:09:06 -07005#include <linux/atomic.h>
Paul Gortmaker187f1882011-11-23 20:12:59 -05006#include <linux/bug.h>
Eduard - Gabriel Munteanuca31e142008-07-05 12:14:23 +03007
Alexey Dobriyan9b7f7502006-08-05 12:14:27 -07008struct task_struct;
9
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070010extern int debug_locks;
11extern int debug_locks_silent;
12
Frederic Weisbecker9eeba612009-04-11 03:17:17 +020013
14static inline int __debug_locks_off(void)
15{
16 return xchg(&debug_locks, 0);
17}
18
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070019/*
20 * Generic 'turn off all lock debugging' function:
21 */
22extern int debug_locks_off(void);
23
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070024#define DEBUG_LOCKS_WARN_ON(c) \
25({ \
26 int __ret = 0; \
27 \
Andrew Morton53b9d872008-09-11 17:02:58 -070028 if (!oops_in_progress && unlikely(c)) { \
Ingo Molnar9127d4b2006-12-22 01:08:52 -080029 if (debug_locks_off() && !debug_locks_silent) \
James Hogan2c2fea12013-04-29 15:06:06 -070030 WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c); \
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070031 __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
Kyle McMartinf86e4512006-08-13 21:09:31 -040048struct task_struct;
49
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070050#ifdef CONFIG_LOCKDEP
51extern void debug_show_all_locks(void);
52extern void debug_show_held_locks(struct task_struct *task);
53extern void debug_check_no_locks_freed(const void *from, unsigned long len);
Colin Cross1b1d2fb2013-05-06 23:50:08 +000054extern void debug_check_no_locks_held(void);
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070055#else
56static inline void debug_show_all_locks(void)
57{
58}
59
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070060static inline void debug_show_held_locks(struct task_struct *task)
61{
62}
63
64static inline void
65debug_check_no_locks_freed(const void *from, unsigned long len)
66{
67}
68
69static inline void
Colin Cross1b1d2fb2013-05-06 23:50:08 +000070debug_check_no_locks_held(void)
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070071{
72}
73#endif
74
75#endif