Commit a648ec05bb950fae2f35d0490ddd6cf15010af72

Authored by Thomas Renninger
Committed by Greg Kroah-Hartman
1 parent fd89cfb871

Dynamic Debug: Introduce ddebug_query= boot parameter

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>

Showing 3 changed files with 52 additions and 2 deletions Side-by-side Diff

Documentation/dynamic-debug-howto.txt
... ... @@ -24,7 +24,7 @@
24 24 read to display the complete list of known debug statements, to help guide you
25 25  
26 26 Controlling dynamic debug Behaviour
27   -===============================
  27 +===================================
28 28  
29 29 The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
30 30 control file in the 'debugfs' filesystem. Thus, you must first mount the debugfs
... ... @@ -211,6 +211,26 @@
211 211 Note the regexp ^[-+=][scp]+$ matches a flags specification.
212 212 Note also that there is no convenient syntax to remove all
213 213 the flags at once, you need to use "-psc".
  214 +
  215 +
  216 +Debug messages during boot process
  217 +==================================
  218 +
  219 +To be able to activate debug messages during the boot process,
  220 +even before userspace and debugfs exists, use the boot parameter:
  221 +ddebug_query="QUERY"
  222 +
  223 +QUERY follows the syntax described above, but must not exceed 1023
  224 +characters. The enablement of debug messages is done as an arch_initcall.
  225 +Thus you can enable debug messages in all code processed after this
  226 +arch_initcall via this boot parameter.
  227 +On an x86 system for example ACPI enablement is a subsys_initcall and
  228 +ddebug_query="file ec.c +p"
  229 +will show early Embedded Controller transactions during ACPI setup if
  230 +your machine (typically a laptop) has an Embedded Controller.
  231 +PCI (or other devices) initialization also is a hot candidate for using
  232 +this boot parameter for debugging purposes.
  233 +
214 234  
215 235 Examples
216 236 ========
Documentation/kernel-parameters.txt
... ... @@ -43,10 +43,11 @@
43 43 AVR32 AVR32 architecture is enabled.
44 44 AX25 Appropriate AX.25 support is enabled.
45 45 BLACKFIN Blackfin architecture is enabled.
46   - DRM Direct Rendering Management support is enabled.
47 46 EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
48 47 EFI EFI Partitioning (GPT) is enabled
49 48 EIDE EIDE/ATAPI support is enabled.
  49 + DRM Direct Rendering Management support is enabled.
  50 + DYNAMIC_DEBUG Build in debug messages and enable them at runtime
50 51 FB The frame buffer device is enabled.
51 52 GCOV GCOV profiling is enabled.
52 53 HW Appropriate hardware is enabled.
... ... @@ -569,6 +570,10 @@
569 570 (one device per port)
570 571 Format: <port#>,<type>
571 572 See also Documentation/input/joystick-parport.txt
  573 +
  574 + ddebug_query= [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
  575 + time. See Documentation/dynamic-debug-howto.txt for
  576 + details.
572 577  
573 578 debug [KNL] Enable kernel debugging (events log level).
574 579  
... ... @@ -450,6 +450,19 @@
450 450 return 0;
451 451 }
452 452  
  453 +static __initdata char ddebug_setup_string[1024];
  454 +static __init int ddebug_setup_query(char *str)
  455 +{
  456 + if (strlen(str) >= 1024) {
  457 + pr_warning("ddebug boot param string too large\n");
  458 + return 0;
  459 + }
  460 + strcpy(ddebug_setup_string, str);
  461 + return 1;
  462 +}
  463 +
  464 +__setup("ddebug_query=", ddebug_setup_query);
  465 +
453 466 /*
454 467 * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the
455 468 * command text from userspace, parses and executes it.
... ... @@ -769,6 +782,18 @@
769 782 }
770 783 ret = ddebug_add_module(iter_start, n, modname);
771 784 }
  785 +
  786 + /* ddebug_query boot param got passed -> set it up */
  787 + if (ddebug_setup_string[0] != '\0') {
  788 + ret = ddebug_exec_query(ddebug_setup_string);
  789 + if (ret)
  790 + pr_warning("Invalid ddebug boot param %s",
  791 + ddebug_setup_string);
  792 + else
  793 + pr_info("ddebug initialized with string %s",
  794 + ddebug_setup_string);
  795 + }
  796 +
772 797 out_free:
773 798 if (ret) {
774 799 ddebug_remove_all_tables();