[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <9ed065de828693a9aa358305627d32e247eacf1d.1764272407.git.chris@chrisdown.name>
Date: Fri, 28 Nov 2025 03:43:50 +0800
From: Chris Down <chris@...isdown.name>
To: Petr Mladek <pmladek@...e.com>
Cc: linux-kernel@...r.kernel.org,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Sergey Senozhatsky <senozhatsky@...omium.org>,
Steven Rostedt <rostedt@...dmis.org>,
John Ogness <john.ogness@...utronix.de>,
Geert Uytterhoeven <geert@...ux-m68k.org>,
Tony Lindgren <tony.lindgren@...ux.intel.com>, kernel-team@...com
Subject: [PATCH v8 11/21] printk: Add ignore_per_console_loglevel module
parameter
With per-console loglevels now functional, there are scenarios where
administrators need to quickly disable them and revert to the global
console_loglevel for all consoles. This is useful for debugging message
emission issues or when needing to break glass in emergencies.
This commit introduces the ignore_per_console_loglevel parameter which
can be set via the kernel command line or at runtime through
/sys/module/printk/parameters/ignore_per_console_loglevel or on the
kernel command line. When set, per-console loglevels are bypassed and
the global console_loglevel is used for all consoles.
Reviewed-by: Petr Mladek <pmladek@...e.com>
Signed-off-by: Chris Down <chris@...isdown.name>
---
Documentation/admin-guide/kernel-parameters.txt | 7 +++++++
include/linux/printk.h | 2 ++
kernel/printk/printk.c | 17 ++++++++++++++++-
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 3edc5ce0e2a3..7b62a99489b8 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2177,6 +2177,13 @@
could change it dynamically, usually by
/sys/module/printk/parameters/ignore_loglevel.
+ ignore_per_console_loglevel [KNL,EARLY]
+ Ignore all per-console loglevel settings
+ and use only the global console_loglevel for all
+ consoles. This can also be set at runtime via
+ /sys/module/printk/parameters/ignore_per_console_loglevel.
+ See Documentation/admin-guide/per-console-loglevel.rst.
+
ignore_rlimit_data
Ignore RLIMIT_DATA setting for data mappings,
print warning at first misuse. Can be changed via
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 45c663124c9b..0aa8cb8ddc09 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -73,6 +73,8 @@ extern int console_printk[];
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
+extern bool ignore_per_console_loglevel;
+
extern void console_verbose(void);
/* strlen("ratelimit") + 1 */
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 98d2f4466aad..e5b6a926135e 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -104,6 +104,9 @@ DEFINE_STATIC_SRCU(console_srcu);
*/
int __read_mostly suppress_printk;
+/* The sysrq infrastructure needs this even on !CONFIG_PRINTK. */
+bool __read_mostly ignore_per_console_loglevel;
+
#ifdef CONFIG_LOCKDEP
static struct lockdep_map console_lock_dep_map = {
.name = "console_lock"
@@ -1280,6 +1283,18 @@ module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(ignore_loglevel,
"ignore loglevel setting (prints all kernel messages to the console)");
+static int __init ignore_per_console_loglevel_setup(char *str)
+{
+ ignore_per_console_loglevel = true;
+ return 0;
+}
+
+early_param("ignore_per_console_loglevel", ignore_per_console_loglevel_setup);
+module_param(ignore_per_console_loglevel, bool, 0644);
+MODULE_PARM_DESC(
+ ignore_per_console_loglevel,
+ "ignore per-console loglevel setting (only respect global console loglevel)");
+
/**
* is_valid_per_console_loglevel - Check if a loglevel is valid for per-console
*
@@ -1317,7 +1332,7 @@ console_effective_loglevel_source(int con_level)
if (ignore_loglevel)
return LLS_IGNORE_LOGLEVEL;
- if (is_valid_per_console_loglevel(con_level))
+ if (!ignore_per_console_loglevel && is_valid_per_console_loglevel(con_level))
return LLS_LOCAL;
return LLS_GLOBAL;
--
2.51.2
Powered by blists - more mailing lists