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