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@suse.com>
Signed-off-by: Chris Down <chris@chrisdown.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