Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Variables
debug.h File Reference
#include <linux/types.h>
#include <linux/slab.h>

Go to the source code of this file.

Data Structures

struct  d_level
 

Macros

#define _d_printf(l, tag, dev, f, a...)
 
#define __D_PASTE__(varname, modulename)   varname##_##modulename
 
#define __D_PASTE(varname, modulename)   (__D_PASTE__(varname, modulename))
 
#define _D_SUBMODULE_INDEX(_name)   (D_SUBMODULE_DECLARE(_name))
 
#define D_LEVEL   __D_PASTE(d_level, D_MODULENAME)
 
#define D_LEVEL_SIZE   __D_PASTE(d_level_size, D_MODULENAME)
 
#define D_MODULENAME   undefined_modulename
 
#define D_MASTER   0
 
#define D_SUBMODULE   undefined_module
 
#define D_SUBMODULE_DECLARE(_name)   __D_SUBMODULE_##_name
 
#define D_SUBMODULE_DEFINE(_name)
 
#define d_test(l)
 
#define d_fnstart(l, _dev, f, a...)   _d_printf(l, " FNSTART", _dev, f, ## a)
 
#define d_fnend(l, _dev, f, a...)   _d_printf(l, " FNEND", _dev, f, ## a)
 
#define d_printf(l, _dev, f, a...)   _d_printf(l, "", _dev, f, ## a)
 
#define d_dump(l, dev, ptr, size)
 
#define d_level_register_debugfs(prefix, name, parent)
 

Variables

struct d_level D_LEVEL []
 
size_t D_LEVEL_SIZE
 

Macro Definition Documentation

#define __D_PASTE (   varname,
  modulename 
)    (__D_PASTE__(varname, modulename))

Definition at line 214 of file debug.h.

#define __D_PASTE__ (   varname,
  modulename 
)    varname##_##modulename

Definition at line 213 of file debug.h.

#define _d_printf (   l,
  tag,
  dev,
  f,
  a... 
)
Value:
do { \
char head[64]; \
if (!d_test(l)) \
break; \
__d_head(head, sizeof(head), dev); \
printk(KERN_ERR "%s%s%s: " f, head, __func__, tag, ##a); \
} while (0)

Definition at line 199 of file debug.h.

#define _D_SUBMODULE_INDEX (   _name)    (D_SUBMODULE_DECLARE(_name))

Definition at line 215 of file debug.h.

#define d_dump (   l,
  dev,
  ptr,
  size 
)
Value:
do { \
char head[64]; \
if (!d_test(l)) \
break; \
__d_head(head, sizeof(head), dev); \
print_hex_dump(KERN_ERR, head, 0, 16, 1, \
((void *) ptr), (size), 0); \
} while (0)

d_dump - log buffer hex dump if debugging enabled

: intended debug level : 'struct device' pointer, NULL if none (for context) : printf-like format and arguments

Definition at line 414 of file debug.h.

#define d_fnend (   l,
  _dev,
  f,
  a... 
)    _d_printf(l, " FNEND", _dev, f, ## a)

d_fnend - log message at function end if debugging enabled

: intended debug level : 'struct device' pointer, NULL if none (for context) : printf-like format and arguments

Definition at line 394 of file debug.h.

#define d_fnstart (   l,
  _dev,
  f,
  a... 
)    _d_printf(l, " FNSTART", _dev, f, ## a)

d_fnstart - log message at function start if debugging enabled

: intended debug level : 'struct device' pointer, NULL if none (for context) : printf-like format and arguments

Definition at line 384 of file debug.h.

#define D_LEVEL   __D_PASTE(d_level, D_MODULENAME)

Definition at line 237 of file debug.h.

#define d_level_register_debugfs (   prefix,
  name,
  parent 
)
Value:
({ \
int rc; \
struct dentry *verify_parent_type = parent; \
prefix #name, 0600, verify_parent_type, \
&(D_LEVEL[__D_SUBMODULE_ ## name].level)); \
rc = PTR_ERR(fd); \
if (IS_ERR(fd) && rc != -ENODEV) \
printk(KERN_ERR "%s: Can't create debugfs entry %s: " \
"%d\n", __func__, prefix #name, rc); \
else \
rc = 0; \
rc; \
})

Export a submodule's debug level over debugfs as PREFIXSUBMODULE

: string to prefix the name with : name of submodule (not a string, just the name) : debugfs parent dentry

Returns: 0 if ok, < 0 errno on error.

For removing, just use debugfs_remove_recursive() on the parent.

Definition at line 436 of file debug.h.

#define D_LEVEL_SIZE   __D_PASTE(d_level_size, D_MODULENAME)

Definition at line 238 of file debug.h.

#define D_MASTER   0

D_MASTER - Compile time maximum debug level

#define in your debug-levels.h file to the maximum debug level the runtime code will be allowed to have. This allows you to provide a main knob.

Anything above that level will be optimized out of the compile.

Defaults to zero (no debug code compiled in).

Maximum one definition per module (at the debug-levels.h file).

Definition at line 279 of file debug.h.

#define D_MODULENAME   undefined_modulename

D_MODULE - Name of the current module

#define in your module's debug-levels.h, making sure it is unique. This has to be a legal C identifier.

Definition at line 260 of file debug.h.

#define d_printf (   l,
  _dev,
  f,
  a... 
)    _d_printf(l, "", _dev, f, ## a)

d_printf - log message if debugging enabled

: intended debug level : 'struct device' pointer, NULL if none (for context) : printf-like format and arguments

Definition at line 404 of file debug.h.

#define D_SUBMODULE   undefined_module

D_SUBMODULE - Name of the current submodule

#define in your submodule .c file before #including debug-levels.h to the name of the current submodule as previously declared and defined with D_SUBMODULE_DECLARE() (in your module's debug-levels.h) and D_SUBMODULE_DEFINE().

This is used to provide runtime-control over the debug levels.

Maximum one per .c file! Can be shared among different .c files (meaning they belong to the same submodule categorization).

Definition at line 297 of file debug.h.

#define D_SUBMODULE_DECLARE (   _name)    __D_SUBMODULE_##_name

D_SUBMODULE_DECLARE - Declare a submodule for runtime debug level control

: name of the submodule, restricted to the chars that make up a valid C identifier ([a-zA-Z0-9_]).

Declare in the module's debug-levels.h header file as:

enum d_module { D_SUBMODULE_DECLARE(submodule_1), D_SUBMODULE_DECLARE(submodule_2), D_SUBMODULE_DECLARE(submodule_3), };

Some corresponding .c file needs to have a matching D_SUBMODULE_DEFINE().

Definition at line 318 of file debug.h.

#define D_SUBMODULE_DEFINE (   _name)
Value:
[__D_SUBMODULE_##_name] = { \
.level = 0, \
.name = #_name \
}

D_SUBMODULE_DEFINE - Define a submodule for runtime debug level control

: name of the submodule, restricted to the chars that make up a valid C identifier ([a-zA-Z0-9_]).

Use once per module (in some .c file) as:

static struct d_level d_level_SUBMODULENAME[] = { D_SUBMODULE_DEFINE(submodule_1), D_SUBMODULE_DEFINE(submodule_2), D_SUBMODULE_DEFINE(submodule_3), }; size_t d_level_size_SUBDMODULENAME = ARRAY_SIZE(d_level_SUBDMODULENAME);

Matching D_SUBMODULE_DECLARE()s have to be present in a debug-levels.h header file.

Definition at line 340 of file debug.h.

#define d_test (   l)
Value:
({ \
unsigned __l = l; /* type enforcer */ \
(D_MASTER) >= __l \
&& ({ \
D_LEVEL[_D_SUBMODULE_INDEX(D_SUBMODULE)].level >= __l; \
}); \
})

d_test - Returns true if debugging should be enabled

: intended debug level (unsigned)

If the master debug switch is enabled and the current settings are higher or equal to the requested level, then debugging output/actions should be enabled.

NOTE:

This needs to be coded so that it can be evaluated in compile time; this is why the ugly BUG_ON() is placed in there, so the D_MASTER evaluation compiles all out if it is compile-time false.

Definition at line 366 of file debug.h.

Variable Documentation

struct d_level D_LEVEL[]

Definition at line 996 of file driver.c.

size_t D_LEVEL_SIZE

Definition at line 1007 of file driver.c.