1#ifndef _DYNAMIC_DEBUG_H
2#define _DYNAMIC_DEBUG_H
3
4
5
6
7
8
9struct _ddebug {
10
11
12
13
14 const char *modname;
15 const char *function;
16 const char *filename;
17 const char *format;
18 unsigned int lineno:18;
19
20
21
22
23
24#define _DPRINTK_FLAGS_NONE 0
25#define _DPRINTK_FLAGS_PRINT (1<<0)
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
113 printk(KERN_WARNING "dyndbg param is supported only in "
114 "CONFIG_DYNAMIC_DEBUG builds\n");
115 return 0;
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