at v2.6.29 93 lines 3.0 kB view raw
1#ifndef _DYNAMIC_PRINTK_H 2#define _DYNAMIC_PRINTK_H 3 4#define DYNAMIC_DEBUG_HASH_BITS 6 5#define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS) 6 7#define TYPE_BOOLEAN 1 8 9#define DYNAMIC_ENABLED_ALL 0 10#define DYNAMIC_ENABLED_NONE 1 11#define DYNAMIC_ENABLED_SOME 2 12 13extern int dynamic_enabled; 14 15/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which 16 * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They 17 * use independent hash functions, to reduce the chance of false positives. 18 */ 19extern long long dynamic_printk_enabled; 20extern long long dynamic_printk_enabled2; 21 22struct mod_debug { 23 char *modname; 24 char *logical_modname; 25 char *flag_names; 26 int type; 27 int hash; 28 int hash2; 29} __attribute__((aligned(8))); 30 31int register_dynamic_debug_module(char *mod_name, int type, char *share_name, 32 char *flags, int hash, int hash2); 33 34#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) 35extern int unregister_dynamic_debug_module(char *mod_name); 36extern int __dynamic_dbg_enabled_helper(char *modname, int type, 37 int value, int hash); 38 39#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ \ 40 int __ret = 0; \ 41 if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) && \ 42 (dynamic_printk_enabled2 & (1LL << DEBUG_HASH2)))) \ 43 __ret = __dynamic_dbg_enabled_helper(module, type, \ 44 value, hash);\ 45 __ret; }) 46 47#define dynamic_pr_debug(fmt, ...) do { \ 48 static char mod_name[] \ 49 __attribute__((section("__verbose_strings"))) \ 50 = KBUILD_MODNAME; \ 51 static struct mod_debug descriptor \ 52 __used \ 53 __attribute__((section("__verbose"), aligned(8))) = \ 54 { mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\ 55 if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \ 56 0, 0, DEBUG_HASH)) \ 57 printk(KERN_DEBUG KBUILD_MODNAME ":" fmt, \ 58 ##__VA_ARGS__); \ 59 } while (0) 60 61#define dynamic_dev_dbg(dev, format, ...) do { \ 62 static char mod_name[] \ 63 __attribute__((section("__verbose_strings"))) \ 64 = KBUILD_MODNAME; \ 65 static struct mod_debug descriptor \ 66 __used \ 67 __attribute__((section("__verbose"), aligned(8))) = \ 68 { mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\ 69 if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \ 70 0, 0, DEBUG_HASH)) \ 71 dev_printk(KERN_DEBUG, dev, \ 72 KBUILD_MODNAME ": " format, \ 73 ##__VA_ARGS__); \ 74 } while (0) 75 76#else 77 78static inline int unregister_dynamic_debug_module(const char *mod_name) 79{ 80 return 0; 81} 82static inline int __dynamic_dbg_enabled_helper(char *modname, int type, 83 int value, int hash) 84{ 85 return 0; 86} 87 88#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ 0; }) 89#define dynamic_pr_debug(fmt, ...) do { } while (0) 90#define dynamic_dev_dbg(dev, format, ...) do { } while (0) 91#endif 92 93#endif