linux/include/linux/debug_locks.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __LINUX_DEBUG_LOCKING_H
   3#define __LINUX_DEBUG_LOCKING_H
   4
   5#include <linux/atomic.h>
   6#include <linux/bug.h>
   7#include <linux/printk.h>
   8
   9struct task_struct;
  10
  11extern int debug_locks __read_mostly;
  12extern int debug_locks_silent __read_mostly;
  13
  14
  15static __always_inline int __debug_locks_off(void)
  16{
  17        return xchg(&debug_locks, 0);
  18}
  19
  20/*
  21 * Generic 'turn off all lock debugging' function:
  22 */
  23extern int debug_locks_off(void);
  24
  25#define DEBUG_LOCKS_WARN_ON(c)                                          \
  26({                                                                      \
  27        int __ret = 0;                                                  \
  28                                                                        \
  29        if (!oops_in_progress && unlikely(c)) {                         \
  30                instrumentation_begin();                                \
  31                if (debug_locks_off() && !debug_locks_silent)           \
  32                        WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c);         \
  33                instrumentation_end();                                  \
  34                __ret = 1;                                              \
  35        }                                                               \
  36        __ret;                                                          \
  37})
  38
  39#ifdef CONFIG_SMP
  40# define SMP_DEBUG_LOCKS_WARN_ON(c)                     DEBUG_LOCKS_WARN_ON(c)
  41#else
  42# define SMP_DEBUG_LOCKS_WARN_ON(c)                     do { } while (0)
  43#endif
  44
  45#ifdef CONFIG_DEBUG_LOCKING_API_SELFTESTS
  46  extern void locking_selftest(void);
  47#else
  48# define locking_selftest()     do { } while (0)
  49#endif
  50
  51struct task_struct;
  52
  53#ifdef CONFIG_LOCKDEP
  54extern void debug_show_all_locks(void);
  55extern void debug_show_held_locks(struct task_struct *task);
  56extern void debug_check_no_locks_freed(const void *from, unsigned long len);
  57extern void debug_check_no_locks_held(void);
  58#else
  59static inline void debug_show_all_locks(void)
  60{
  61}
  62
  63static inline void debug_show_held_locks(struct task_struct *task)
  64{
  65}
  66
  67static inline void
  68debug_check_no_locks_freed(const void *from, unsigned long len)
  69{
  70}
  71
  72static inline void
  73debug_check_no_locks_held(void)
  74{
  75}
  76#endif
  77
  78#endif
  79