dynamic_debug: allow to work if debugfs is disabled

With the realization that having debugfs enabled on "production" systems
is generally not a good idea, debugfs is being disabled from more and
more platforms over time.  However, the functionality of dynamic
debugging still is needed at times, and since it relies on debugfs for
its user api, having debugfs disabled also forces dynamic debug to be
disabled.

To get around this, also create the "control" file for dynamic_debug in
procfs.  This allows people turn on debugging as needed at runtime for
individual driverfs and subsystems.

Reported-by: many different companies
Cc: Jason Baron <jbaron@akamai.com>
Acked-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20200210211142.GB1373304@kroah.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Greg Kroah-Hartman 2020-02-10 13:11:42 -08:00
parent 3aef021b2d
commit 239a5791ff
3 changed files with 30 additions and 8 deletions

View File

@ -54,6 +54,9 @@ If you make a mistake with the syntax, the write will fail thus::
<debugfs>/dynamic_debug/control <debugfs>/dynamic_debug/control
-bash: echo: write error: Invalid argument -bash: echo: write error: Invalid argument
Note, for systems without 'debugfs' enabled, the control file can be
found in ``/proc/dynamic_debug/control``.
Viewing Dynamic Debug Behaviour Viewing Dynamic Debug Behaviour
=============================== ===============================

View File

@ -98,7 +98,7 @@ config DYNAMIC_DEBUG
bool "Enable dynamic printk() support" bool "Enable dynamic printk() support"
default n default n
depends on PRINTK depends on PRINTK
depends on DEBUG_FS depends on (DEBUG_FS || PROC_FS)
help help
Compiles debug level messages into the kernel, which would not Compiles debug level messages into the kernel, which would not
@ -116,8 +116,9 @@ config DYNAMIC_DEBUG
Usage: Usage:
Dynamic debugging is controlled via the 'dynamic_debug/control' file, Dynamic debugging is controlled via the 'dynamic_debug/control' file,
which is contained in the 'debugfs' filesystem. Thus, the debugfs which is contained in the 'debugfs' filesystem or procfs.
filesystem must first be mounted before making use of this feature. Thus, the debugfs or procfs filesystem must first be mounted before
making use of this feature.
We refer the control file as: <debugfs>/dynamic_debug/control. This We refer the control file as: <debugfs>/dynamic_debug/control. This
file contains a list of the debug statements that can be enabled. The file contains a list of the debug statements that can be enabled. The
format for each line of the file is: format for each line of the file is:

View File

@ -876,6 +876,14 @@ static const struct file_operations ddebug_proc_fops = {
.write = ddebug_proc_write .write = ddebug_proc_write
}; };
static const struct proc_ops proc_fops = {
.proc_open = ddebug_proc_open,
.proc_read = seq_read,
.proc_lseek = seq_lseek,
.proc_release = seq_release_private,
.proc_write = ddebug_proc_write
};
/* /*
* Allocate a new ddebug_table for the given module * Allocate a new ddebug_table for the given module
* and add it to the global list. * and add it to the global list.
@ -991,15 +999,25 @@ static void ddebug_remove_all_tables(void)
static __initdata int ddebug_init_success; static __initdata int ddebug_init_success;
static int __init dynamic_debug_init_debugfs(void) static int __init dynamic_debug_init_control(void)
{ {
struct dentry *dir; struct proc_dir_entry *procfs_dir;
struct dentry *debugfs_dir;
if (!ddebug_init_success) if (!ddebug_init_success)
return -ENODEV; return -ENODEV;
dir = debugfs_create_dir("dynamic_debug", NULL); /* Create the control file in debugfs if it is enabled */
debugfs_create_file("control", 0644, dir, NULL, &ddebug_proc_fops); if (debugfs_initialized()) {
debugfs_dir = debugfs_create_dir("dynamic_debug", NULL);
debugfs_create_file("control", 0644, debugfs_dir, NULL,
&ddebug_proc_fops);
}
/* Also create the control file in procfs */
procfs_dir = proc_mkdir("dynamic_debug", NULL);
if (procfs_dir)
proc_create("control", 0644, procfs_dir, &proc_fops);
return 0; return 0;
} }
@ -1077,4 +1095,4 @@ out_err:
early_initcall(dynamic_debug_init); early_initcall(dynamic_debug_init);
/* Debugfs setup must be done later */ /* Debugfs setup must be done later */
fs_initcall(dynamic_debug_init_debugfs); fs_initcall(dynamic_debug_init_control);