linux/include/linux/dynamic_debug.h
<<
>>
Prefs
   1#ifndef _DYNAMIC_DEBUG_H
   2#define _DYNAMIC_DEBUG_H
   3
   4/*
   5 * An instance of this structure is created in a special
   6 * ELF section at every dynamic debug callsite.  At runtime,
   7 * the special section is treated as an array of these.
   8 */
   9struct _ddebug {
  10        /*
  11         * These fields are used to drive the user interface
  12         * for selecting and displaying debug callsites.
  13         */
  14        const char *modname;
  15        const char *function;
  16        const char *filename;
  17        const char *format;
  18        unsigned int lineno:18;
  19        /*
  20         * The flags field controls the behaviour at the callsite.
  21         * The bits here are changed dynamically when the user
  22         * writes commands to <debugfs>/dynamic_debug/control
  23         */
  24#define _DPRINTK_FLAGS_NONE     0
  25#define _DPRINTK_FLAGS_PRINT    (1<<0) /* printk() a message using the format */
  26#define _DPRINTK_FLAGS_INCL_MODNAME     (1<<1)
  27#define _DPRINTK_FLAGS_INCL_FUNCNAME    (1<<2)
  28#define _DPRINTK_FLAGS_INCL_LINENO      (1<<3)
  29#define _DPRINTK_FLAGS_INCL_TID         (1<<4)
  30#if defined DEBUG
  31#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
  32#else
  33#define _DPRINTK_FLAGS_DEFAULT 0
  34#endif
  35        unsigned int flags:8;
  36} __attribute__((aligned(8)));
  37
  38
  39int ddebug_add_module(struct _ddebug *tab, unsigned int n,
  40                                const char *modname);
  41
  42#if defined(CONFIG_DYNAMIC_DEBUG)
  43extern int ddebug_remove_module(const char *mod_name);
  44extern __printf(2, 3)
  45int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
  46
  47extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
  48                                        const char *modname);
  49
  50struct device;
  51
  52extern __printf(3, 4)
  53int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
  54                      const char *fmt, ...);
  55
  56struct net_device;
  57
  58extern __printf(3, 4)
  59int __dynamic_netdev_dbg(struct _ddebug *descriptor,
  60                         const struct net_device *dev,
  61                         const char *fmt, ...);
  62
  63#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)                \
  64        static struct _ddebug  __aligned(8)                     \
  65        __attribute__((section("__verbose"))) name = {          \
  66                .modname = KBUILD_MODNAME,                      \
  67                .function = __func__,                           \
  68                .filename = __FILE__,                           \
  69                .format = (fmt),                                \
  70                .lineno = __LINE__,                             \
  71                .flags =  _DPRINTK_FLAGS_DEFAULT,               \
  72        }
  73
  74#define dynamic_pr_debug(fmt, ...)                              \
  75do {                                                            \
  76        DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
  77        if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
  78                __dynamic_pr_debug(&descriptor, pr_fmt(fmt),    \
  79                                   ##__VA_ARGS__);              \
  80} while (0)
  81
  82#define dynamic_dev_dbg(dev, fmt, ...)                          \
  83do {                                                            \
  84        DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
  85        if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
  86                __dynamic_dev_dbg(&descriptor, dev, fmt,        \
  87                                  ##__VA_ARGS__);               \
  88} while (0)
  89
  90#define dynamic_netdev_dbg(dev, fmt, ...)                       \
  91do {                                                            \
  92        DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);         \
  93        if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
  94                __dynamic_netdev_dbg(&descriptor, dev, fmt,     \
  95                                     ##__VA_ARGS__);            \
  96} while (0)
  97
  98#else
  99
 100#include <linux/string.h>
 101#include <linux/errno.h>
 102
 103static inline int ddebug_remove_module(const char *mod)
 104{
 105        return 0;
 106}
 107
 108static inline int ddebug_dyndbg_module_param_cb(char *param, char *val,
 109                                                const char *modname)
 110{
 111        if (strstr(param, "dyndbg")) {
 112                /* avoid pr_warn(), which wants pr_fmt() fully defined */
 113                printk(KERN_WARNING "dyndbg param is supported only in "
 114                        "CONFIG_DYNAMIC_DEBUG builds\n");
 115                return 0; /* allow and ignore */
 116        }
 117        return -EINVAL;
 118}
 119
 120#define dynamic_pr_debug(fmt, ...)                                      \
 121        do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
 122#define dynamic_dev_dbg(dev, fmt, ...)                                  \
 123        do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
 124#endif
 125
 126#endif
 127