at v2.6.38-rc8 2.4 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 static struct _ddebug descriptor \ 48 __used \ 49 __attribute__((section("__verbose"), aligned(8))) = \ 50 { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ 51 _DPRINTK_FLAGS_DEFAULT }; \ 52 if (unlikely(descriptor.enabled)) \ 53 printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ 54 } while (0) 55 56 57#define dynamic_dev_dbg(dev, fmt, ...) do { \ 58 static struct _ddebug descriptor \ 59 __used \ 60 __attribute__((section("__verbose"), aligned(8))) = \ 61 { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ 62 _DPRINTK_FLAGS_DEFAULT }; \ 63 if (unlikely(descriptor.enabled)) \ 64 dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ 65 } while (0) 66 67#else 68 69static inline int ddebug_remove_module(const char *mod) 70{ 71 return 0; 72} 73 74#define dynamic_pr_debug(fmt, ...) \ 75 do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) 76#define dynamic_dev_dbg(dev, fmt, ...) \ 77 do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) 78#endif 79 80#endif