19a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#ifndef __LINUX_DEBUG_LOCKING_H
29a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#define __LINUX_DEBUG_LOCKING_H
39a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
4ca31e146d5c2fe51498e619eb3a64782d02e310aEduard - Gabriel Munteanu#include <linux/kernel.h>
560063497a95e716c9a689af3be2687d261f115b4Arun Sharma#include <linux/atomic.h>
6187f1882b5b0748b3c4c22274663fdb372ac0452Paul Gortmaker#include <linux/bug.h>
7ca31e146d5c2fe51498e619eb3a64782d02e310aEduard - Gabriel Munteanu
89b7f750d446a717d4c8346fbb165b62661019b92Alexey Dobriyanstruct task_struct;
99b7f750d446a717d4c8346fbb165b62661019b92Alexey Dobriyan
109a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern int debug_locks;
119a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern int debug_locks_silent;
129a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
139eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbecker
149eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbeckerstatic inline int __debug_locks_off(void)
159eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbecker{
169eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbecker	return xchg(&debug_locks, 0);
179eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbecker}
189eeba6138cefc0435695463ddadb0d95e0a6bcd2Frederic Weisbecker
199a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar/*
209a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar * Generic 'turn off all lock debugging' function:
219a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar */
229a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern int debug_locks_off(void);
239a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
249a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#define DEBUG_LOCKS_WARN_ON(c)						\
259a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar({									\
269a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar	int __ret = 0;							\
279a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar									\
2853b9d87f41a3d8838210ad7cdef02d814817ce85Andrew Morton	if (!oops_in_progress && unlikely(c)) {				\
299127d4b1d9b2e8fba8e7fbc7f88ea93e5eb01396Ingo Molnar		if (debug_locks_off() && !debug_locks_silent)		\
309a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar			WARN_ON(1);					\
319a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar		__ret = 1;						\
329a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar	}								\
339a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar	__ret;								\
349a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar})
359a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
369a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#ifdef CONFIG_SMP
379a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar# define SMP_DEBUG_LOCKS_WARN_ON(c)			DEBUG_LOCKS_WARN_ON(c)
389a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#else
399a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar# define SMP_DEBUG_LOCKS_WARN_ON(c)			do { } while (0)
409a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#endif
419a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
429a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#ifdef CONFIG_DEBUG_LOCKING_API_SELFTESTS
439a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar  extern void locking_selftest(void);
449a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#else
459a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar# define locking_selftest()	do { } while (0)
469a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#endif
479a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
48f86e45131f9d41b1617fbaac7aa1ef23e8d0ab48Kyle McMartinstruct task_struct;
49f86e45131f9d41b1617fbaac7aa1ef23e8d0ab48Kyle McMartin
509a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#ifdef CONFIG_LOCKDEP
519a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern void debug_show_all_locks(void);
529a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern void debug_show_held_locks(struct task_struct *task);
539a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern void debug_check_no_locks_freed(const void *from, unsigned long len);
549a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarextern void debug_check_no_locks_held(struct task_struct *task);
559a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#else
569a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarstatic inline void debug_show_all_locks(void)
579a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar{
589a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar}
599a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
609a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarstatic inline void debug_show_held_locks(struct task_struct *task)
619a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar{
629a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar}
639a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
649a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarstatic inline void
659a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnardebug_check_no_locks_freed(const void *from, unsigned long len)
669a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar{
679a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar}
689a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
699a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnarstatic inline void
709a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnardebug_check_no_locks_held(struct task_struct *task)
719a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar{
729a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar}
739a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#endif
749a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar
759a11b49a805665e13a56aa067afaf81d43ec1514Ingo Molnar#endif
76