linux/include/linux/dynamic_printk.h
<<
>>
Prefs
   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
  94
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.