History

driver core: basic infrastructure for per-module dynamic debug messages

Base infrastructure to enable per-module debug messages. I've introduced CONFIG_DYNAMIC_PRINTK_DEBUG, which when enabled centralizes control of debugging statements on a per-module basis in one /proc file, currently, <debugfs>/dynamic_printk/modules. When, CONFIG_DYNAMIC_PRINTK_DEBUG, is not set, debugging statements can still be enabled as before, often by defining 'DEBUG' for the proper compilation unit. Thus, this patch set has no affect when CONFIG_DYNAMIC_PRINTK_DEBUG is not set. The infrastructure currently ties into all pr_debug() and dev_dbg() calls. That is, if CONFIG_DYNAMIC_PRINTK_DEBUG is set, all pr_debug() and dev_dbg() calls can be dynamically enabled/disabled on a per-module basis. Future plans include extending this functionality to subsystems, that define their own debug levels and flags. Usage: Dynamic debugging is controlled by the debugfs file, <debugfs>/dynamic_printk/modules. This file contains a list of the modules that can be enabled. The format of the file is as follows: <module_name> <enabled=0/1> . . . <module_name> : Name of the module in which the debug call resides <enabled=0/1> : whether the messages are enabled or not For example: snd_hda_intel enabled=0 fixup enabled=1 driver enabled=0 Enable a module: $echo "set enabled=1 <module_name>" > dynamic_printk/modules Disable a module: $echo "set enabled=0 <module_name>" > dynamic_printk/modules Enable all modules: $echo "set enabled=1 all" > dynamic_printk/modules Disable all modules: $echo "set enabled=0 all" > dynamic_printk/modules Finally, passing "dynamic_printk" at the command line enables debugging for all modules. This mode can be turned off via the above disable command. [gkh: minor cleanups and tweaks to make the build work quietly]

Jason Baron committed 18 years ago

Commit 346e15b1 parent 33376c114 files · +700 −7Browse files

Showing the changes to scripts/basic (2 of 14 files). Show all

Unified · Split

2 files
  1. scripts/basic/Makefile +1 −1
  2. scripts/basic/hash.c +64 −0
scripts/basic/Makefile+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 # fixdep: Used to generate dependency information during build process
1010 # docproc: Used in Documentation/DocBook
1111
12−hostprogs-y := fixdep docproc
12+hostprogs-y := fixdep docproc hash
1313 always := $(hostprogs-y)
1414
1515 # fixdep is needed to compile other host programs
scripts/basic/hash.c+64−0
@@ -0,0 +1,64 @@
1+/*
2+ * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com>
3+ *
4+ */
5+
6+#include <stdio.h>
7+#include <stdlib.h>
8+#include <string.h>
9+
10+#define DYNAMIC_DEBUG_HASH_BITS 6
11+
12+static const char *program;
13+
14+static void usage(void)
15+{
16+ printf("Usage: %s <djb2|r5> <modname>\n", program);
17+ exit(1);
18+}
19+
20+/* djb2 hashing algorithm by Dan Bernstein. From:
21+ * http://www.cse.yorku.ca/~oz/hash.html
22+ */
23+
24+unsigned int djb2_hash(char *str)
25+{
26+ unsigned long hash = 5381;
27+ int c;
28+
29+ c = *str;
30+ while (c) {
31+ hash = ((hash << 5) + hash) + c;
32+ c = *++str;
33+ }
34+ return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
35+}
36+
37+unsigned int r5_hash(char *str)
38+{
39+ unsigned long hash = 0;
40+ int c;
41+
42+ c = *str;
43+ while (c) {
44+ hash = (hash + (c << 4) + (c >> 4)) * 11;
45+ c = *++str;
46+ }
47+ return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
48+}
49+
50+int main(int argc, char *argv[])
51+{
52+ program = argv[0];
53+
54+ if (argc != 3)
55+ usage();
56+ if (!strcmp(argv[1], "djb2"))
57+ printf("%d\n", djb2_hash(argv[2]));
58+ else if (!strcmp(argv[1], "r5"))
59+ printf("%d\n", r5_hash(argv[2]));
60+ else
61+ usage();
62+ exit(0);
63+}
64+