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]
Showing the changes to scripts/basic (2 of 14 files). Show all
Unified · Split
| @@ -9,7 +9,7 @@ · 8 unmodified lines | ||
| 9 | 9 | # fixdep: Used to generate dependency information during build process |
| 10 | 10 | # docproc: Used in Documentation/DocBook |
| 11 | 11 | |
| 12 | −hostprogs-y := fixdep docproc | |
| 12 | +hostprogs-y := fixdep docproc hash | |
| 13 | 13 | always := $(hostprogs-y) |
| 14 | 14 | |
| 15 | 15 | # fixdep is needed to compile other host programs |
| @@ -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 | + | |