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                if (debug_locks_off() && !debug_locks_silent)           \
  31                        WARN(1, "DEBUG_LOCKS_WARN_ON(%s)", #c);         \
  32                __ret = 1;                                              \
  33        }                                                               \
  34        __ret;                                                          \
  35})
  36
  37#ifdef CONFIG_SMP
  38# define SMP_DEBUG_LOCKS_WARN_ON(c)                     DEBUG_LOCKS_WARN_ON(c)
  39#else
  40# define SMP_DEBUG_LOCKS_WARN_ON(c)                     do { } while (0)
  41#endif
  42
  43#ifdef CONFIG_DEBUG_LOCKING_API_SELFTESTS
  44  extern void locking_selftest(void);
  45#else
  46# define locking_selftest()     do { } while (0)
  47#endif
  48
  49struct task_struct;
  50
  51#ifdef CONFIG_LOCKDEP
  52extern void debug_show_all_locks(void);
  53extern 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(void);
  56#else
  57static inline void debug_show_all_locks(void)
  58{
  59}
  60
  61static inline void debug_show_held_locks(struct task_struct *task)
  62{
  63}
  64
  65static inline void
  66debug_check_no_locks_freed(const void *from, unsigned long len)
  67{
  68}
  69
  70static inline void
  71debug_check_no_locks_held(void)
  72{
  73}
  74#endif
  75
  76#endif
  77