blob: 29b3ce3f2a1d0cd948523d8890c0bb8420834e09 [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);
Ingo Molnar82a1fcb2008-01-25 21:08:02 +010052extern void __debug_show_held_locks(struct task_struct *task);
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070053extern void debug_show_held_locks(struct task_struct *task);
54extern void debug_check_no_locks_freed(const void *from, unsigned long len);
55extern void debug_check_no_locks_held(struct task_struct *task);
56#else
57static inline void debug_show_all_locks(void)
58{
59}
60
Ingo Molnar82a1fcb2008-01-25 21:08:02 +010061static inline void __debug_show_held_locks(struct task_struct *task)
62{
63}
64
Ingo Molnar9a11b49a2006-07-03 00:24:33 -070065static inline void debug_show_held_locks(struct task_struct *task)
66{
67}
68
69static inline void
70debug_check_no_locks_freed(const void *from, unsigned long len)
71{
72}
73
74static inline void
75debug_check_no_locks_held(struct task_struct *task)
76{
77}
78#endif
79
80#endif