at v3.1-rc4 2.7 kB view raw
1#ifndef _DYNAMIC_DEBUG_H 2#define _DYNAMIC_DEBUG_H 3 4/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which 5 * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They 6 * use independent hash functions, to reduce the chance of false positives. 7 */ 8extern long long dynamic_debug_enabled; 9extern long long dynamic_debug_enabled2; 10 11/* 12 * An instance of this structure is created in a special 13 * ELF section at every dynamic debug callsite. At runtime, 14 * the special section is treated as an array of these. 15 */ 16struct _ddebug { 17 /* 18 * These fields are used to drive the user interface 19 * for selecting and displaying debug callsites. 20 */ 21 const char *modname; 22 const char *function; 23 const char *filename; 24 const char *format; 25 unsigned int lineno:24; 26 /* 27 * The flags field controls the behaviour at the callsite. 28 * The bits here are changed dynamically when the user 29 * writes commands to <debugfs>/dynamic_debug/control 30 */ 31#define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ 32#define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) 33#define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) 34#define _DPRINTK_FLAGS_INCL_LINENO (1<<3) 35#define _DPRINTK_FLAGS_INCL_TID (1<<4) 36#define _DPRINTK_FLAGS_DEFAULT 0 37 unsigned int flags:8; 38 char enabled; 39} __attribute__((aligned(8))); 40 41 42int ddebug_add_module(struct _ddebug *tab, unsigned int n, 43 const char *modname); 44 45#if defined(CONFIG_DYNAMIC_DEBUG) 46extern int ddebug_remove_module(const char *mod_name); 47extern int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) 48 __attribute__ ((format (printf, 2, 3))); 49 50#define dynamic_pr_debug(fmt, ...) do { \ 51 static struct _ddebug descriptor \ 52 __used \ 53 __attribute__((section("__verbose"), aligned(8))) = \ 54 { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ 55 _DPRINTK_FLAGS_DEFAULT }; \ 56 if (unlikely(descriptor.enabled)) \ 57 __dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ 58 } while (0) 59 60 61#define dynamic_dev_dbg(dev, fmt, ...) do { \ 62 static struct _ddebug descriptor \ 63 __used \ 64 __attribute__((section("__verbose"), aligned(8))) = \ 65 { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ 66 _DPRINTK_FLAGS_DEFAULT }; \ 67 if (unlikely(descriptor.enabled)) \ 68 dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ 69 } while (0) 70 71#else 72 73static inline int ddebug_remove_module(const char *mod) 74{ 75 return 0; 76} 77 78#define dynamic_pr_debug(fmt, ...) \ 79 do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) 80#define dynamic_dev_dbg(dev, fmt, ...) \ 81 do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) 82#endif 83 84#endif