Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a648ec05 authored by Thomas Renninger's avatar Thomas Renninger Committed by Greg Kroah-Hartman
Browse files

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: default avatarThomas Renninger <trenn@suse.de>
Acked-by: default avatar <jbaron@redhat.com>
Acked-by: default avatarPekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fd89cfb8
Loading
Loading
Loading
Loading
+21 −1
Original line number Original line Diff line number Diff line
@@ -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
   read to display the complete list of known debug statements, to help guide you


Controlling dynamic debug Behaviour
Controlling dynamic debug Behaviour
===============================
===================================


The behaviour of pr_debug()/dev_debug()s are controlled via writing to a
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
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
Note also that there is no convenient syntax to remove all
the flags at once, you need to use "-psc".
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
========
========


+6 −1
Original line number Original line Diff line number Diff line
@@ -43,10 +43,11 @@ parameter is applicable:
	AVR32	AVR32 architecture is enabled.
	AVR32	AVR32 architecture is enabled.
	AX25	Appropriate AX.25 support is enabled.
	AX25	Appropriate AX.25 support is enabled.
	BLACKFIN Blackfin architecture is enabled.
	BLACKFIN Blackfin architecture is enabled.
	DRM	Direct Rendering Management support is enabled.
	EDD	BIOS Enhanced Disk Drive Services (EDD) is enabled
	EDD	BIOS Enhanced Disk Drive Services (EDD) is enabled
	EFI	EFI Partitioning (GPT) is enabled
	EFI	EFI Partitioning (GPT) is enabled
	EIDE	EIDE/ATAPI support 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.
	FB	The frame buffer device is enabled.
	GCOV	GCOV profiling is enabled.
	GCOV	GCOV profiling is enabled.
	HW	Appropriate hardware 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>
			Format: <port#>,<type>
			See also Documentation/input/joystick-parport.txt
			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		[KNL] Enable kernel debugging (events log level).


	debug_locks_verbose=
	debug_locks_verbose=
+25 −0
Original line number Original line Diff line number Diff line
@@ -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
 * File_ops->write method for <debugfs>/dynamic_debug/conrol.  Gathers the
 * command text from userspace, parses and executes it.
 * 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:
out_free:
	if (ret) {
	if (ret) {
		ddebug_remove_all_tables();
		ddebug_remove_all_tables();