]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Dynamic Debug: Introduce ddebug_query= boot parameter
authorThomas Renninger <trenn@suse.de>
Fri, 6 Aug 2010 14:11:02 +0000 (16:11 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:16:42 +0000 (10:16 -0700)
Dynamic debug lacks the ability to enable debug messages at boot time.
One could patch initramfs or service startup scripts to write to
/sys/../dynamic_debug/control, but this sucks.

This patch makes it possible to pass a query in the same format one can
write to /sys/../dynamic_debug/control via boot param.
When dynamic debug gets initialized, this query will automatically be
applied.

Signed-off-by: Thomas Renninger <trenn@suse.de>
Acked-by: jbaron@redhat.com
Acked-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Documentation/dynamic-debug-howto.txt
Documentation/kernel-parameters.txt
lib/dynamic_debug.c

index 674c5663d34696bcbc50354eb9edf556def41ef0..58ea64a961653b92e42c6fb384014dc18f250f84 100644 (file)
@@ -24,7 +24,7 @@ Dynamic debug has even more useful features:
    read to display the complete list of known debug statements, to help guide you
 
 Controlling dynamic debug Behaviour
    read to display the complete list of known debug statements, to help guide you
 
 Controlling dynamic debug Behaviour
-===============================
+===================================
 
 The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
 control file in the 'debugfs' filesystem. Thus, you must first mount the debugfs
 
 The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
 control file in the 'debugfs' filesystem. Thus, you must first mount the debugfs
@@ -212,6 +212,26 @@ Note the regexp ^[-+=][scp]+$ matches a flags specification.
 Note also that there is no convenient syntax to remove all
 the flags at once, you need to use "-psc".
 
 Note also that there is no convenient syntax to remove all
 the flags at once, you need to use "-psc".
 
+
+Debug messages during boot process
+==================================
+
+To be able to activate debug messages during the boot process,
+even before userspace and debugfs exists, use the boot parameter:
+ddebug_query="QUERY"
+
+QUERY follows the syntax described above, but must not exceed 1023
+characters. The enablement of debug messages is done as an arch_initcall.
+Thus you can enable debug messages in all code processed after this
+arch_initcall via this boot parameter.
+On an x86 system for example ACPI enablement is a subsys_initcall and
+ddebug_query="file ec.c +p"
+will show early Embedded Controller transactions during ACPI setup if
+your machine (typically a laptop) has an Embedded Controller.
+PCI (or other devices) initialization also is a hot candidate for using
+this boot parameter for debugging purposes.
+
+
 Examples
 ========
 
 Examples
 ========
 
index 8dd7248508a9e12ac8908c24fb4a3649f157697a..3d854c9ae53adfb655492da31cf6cf088d25ad67 100644 (file)
@@ -43,10 +43,11 @@ parameter is applicable:
        AVR32   AVR32 architecture is enabled.
        AX25    Appropriate AX.25 support is enabled.
        BLACKFIN Blackfin architecture is enabled.
        AVR32   AVR32 architecture is enabled.
        AX25    Appropriate AX.25 support is enabled.
        BLACKFIN Blackfin architecture is enabled.
-       DRM     Direct Rendering Management support is enabled.
        EDD     BIOS Enhanced Disk Drive Services (EDD) is enabled
        EFI     EFI Partitioning (GPT) is enabled
        EIDE    EIDE/ATAPI support is enabled.
        EDD     BIOS Enhanced Disk Drive Services (EDD) is enabled
        EFI     EFI Partitioning (GPT) is enabled
        EIDE    EIDE/ATAPI support is enabled.
+       DRM     Direct Rendering Management support is enabled.
+       DYNAMIC_DEBUG Build in debug messages and enable them at runtime
        FB      The frame buffer device is enabled.
        GCOV    GCOV profiling is enabled.
        HW      Appropriate hardware is enabled.
        FB      The frame buffer device is enabled.
        GCOV    GCOV profiling is enabled.
        HW      Appropriate hardware is enabled.
@@ -570,6 +571,10 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: <port#>,<type>
                        See also Documentation/input/joystick-parport.txt
 
                        Format: <port#>,<type>
                        See also Documentation/input/joystick-parport.txt
 
+       ddebug_query=   [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
+                       time. See Documentation/dynamic-debug-howto.txt for
+                       details.
+
        debug           [KNL] Enable kernel debugging (events log level).
 
        debug_locks_verbose=
        debug           [KNL] Enable kernel debugging (events log level).
 
        debug_locks_verbose=
index 84d103c474e4d3bd7a3082c7e5ce76c483916740..44ce66bdb211d82924d75957b732a85586fdb85b 100644 (file)
@@ -450,6 +450,19 @@ static int ddebug_exec_query(char *query_string)
        return 0;
 }
 
        return 0;
 }
 
+static __initdata char ddebug_setup_string[1024];
+static __init int ddebug_setup_query(char *str)
+{
+       if (strlen(str) >= 1024) {
+               pr_warning("ddebug boot param string too large\n");
+               return 0;
+       }
+       strcpy(ddebug_setup_string, str);
+       return 1;
+}
+
+__setup("ddebug_query=", ddebug_setup_query);
+
 /*
  * File_ops->write method for <debugfs>/dynamic_debug/conrol.  Gathers the
  * command text from userspace, parses and executes it.
 /*
  * File_ops->write method for <debugfs>/dynamic_debug/conrol.  Gathers the
  * command text from userspace, parses and executes it.
@@ -769,6 +782,18 @@ static int __init dynamic_debug_init(void)
                }
                ret = ddebug_add_module(iter_start, n, modname);
        }
                }
                ret = ddebug_add_module(iter_start, n, modname);
        }
+
+       /* ddebug_query boot param got passed -> set it up */
+       if (ddebug_setup_string[0] != '\0') {
+               ret = ddebug_exec_query(ddebug_setup_string);
+               if (ret)
+                       pr_warning("Invalid ddebug boot param %s",
+                                  ddebug_setup_string);
+               else
+                       pr_info("ddebug initialized with string %s",
+                               ddebug_setup_string);
+       }
+
 out_free:
        if (ret) {
                ddebug_remove_all_tables();
 out_free:
        if (ret) {
                ddebug_remove_all_tables();