blob: 2833452ea01c8ecec5207a7a8631da3f2b439fa3 [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>
Frederic Weisbecker9eeba612009-04-11 03:17:17 +02005#include <asm/atomic.h>
Ingo Molnar27b19562009-04-14 11:03:12 +02006#include <asm/system.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) \
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070030 WARN_ON(1); \
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
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);
54extern void debug_check_no_locks_held(struct task_struct *task);
55#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
70debug_check_no_locks_held(struct task_struct *task)
71{
72}
73#endif
74
75#endif