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