[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <42d7254ffdfa30fc0bd3f1aa7cac354891e95231.1763492585.git.chris@chrisdown.name>
Date: Wed, 19 Nov 2025 03:08:16 +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 v7 12/13] printk: Deprecate the kernel.printk sysctl interface
The kernel.printk sysctl interface is deprecated in favour of more
granular and clearer sysctl interfaces for controlling loglevels, namely
kernel.console_loglevel and kernel.default_message_loglevel.
kernel.printk has a number of fairly significant usability problems:
- It takes four values in a specific order, which is not intuitive.
Speaking from personal experience, even people working on printk
sometimes need to look up the order of these values, which doesn't
suggest much in the way of perspicuity.
- There is no validation on the input values, so users can set them to
invalid or nonsensical values without receiving any errors or
warnings. This can lead to unpredictable behaviour.
- One of the four values, default_console_loglevel, is not used in the
kernel (see below), making it redundant and potentially confusing.
- Overall, the interface is complex, hard to understand, and combines
multiple controls into a single sysctl, which is not ideal. It should
be separated into distinct controls for clarity.
Setting kernel.printk now calls printk_sysctl_deprecated, which emits a
pr_warn. The warning informs users about the deprecation and suggests
using the new sysctl interfaces instead.
By deprecating kernel.printk, we aim to:
- Encourage users to adopt the new, dedicated sysctl interfaces
(kernel.console_loglevel and kernel.default_message_loglevel), which
are more straightforward and easier to understand.
- Improve input validation and error handling, ensuring that users
receive appropriate feedback when setting invalid values.
- Simplify the configuration of loglevels by exposing only the controls
that are necessary and relevant.
Reviewed-by: Petr Mladek <pmladek@...e.com>
Signed-off-by: Chris Down <chris@...isdown.name>
---
Documentation/admin-guide/sysctl/kernel.rst | 3 +++
kernel/printk/sysctl.c | 14 +++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/sysctl/kernel.rst b/Documentation/admin-guide/sysctl/kernel.rst
index 043d5f663b7d..5ac6db03c2fb 100644
--- a/Documentation/admin-guide/sysctl/kernel.rst
+++ b/Documentation/admin-guide/sysctl/kernel.rst
@@ -1096,6 +1096,9 @@ Messages without an explicit priority will be printed with this priority.
printk
======
+This sysctl is deprecated and will be removed in future. Please consider using
+``kernel.console_loglevel`` or ``kernel.default_message_loglevel`` instead.
+
The four values in printk denote: ``console_loglevel``,
``default_message_loglevel``, ``minimum_console_loglevel`` and
``default_console_loglevel`` respectively.
diff --git a/kernel/printk/sysctl.c b/kernel/printk/sysctl.c
index feec6cf939af..921e0f80ee8f 100644
--- a/kernel/printk/sysctl.c
+++ b/kernel/printk/sysctl.c
@@ -7,6 +7,7 @@
#include <linux/printk.h>
#include <linux/capability.h>
#include <linux/ratelimit.h>
+#include <linux/console.h>
#include "internal.h"
static const int ten_thousand = 10000;
@@ -56,13 +57,24 @@ static int proc_dointvec_console_loglevel(const struct ctl_table *table,
do_proc_dointvec_console_loglevel, NULL);
}
+static int proc_dointvec_printk_deprecated(const struct ctl_table *table, int write,
+ void *buffer, size_t *lenp, loff_t *ppos)
+{
+ int res = proc_dointvec(table, write, buffer, lenp, ppos);
+
+ if (write)
+ pr_warn_once("printk: The kernel.printk sysctl is deprecated. Consider using kernel.console_loglevel or kernel.default_message_loglevel instead.\n");
+
+ return res;
+}
+
static const struct ctl_table printk_sysctls[] = {
{
.procname = "printk",
.data = &console_loglevel,
.maxlen = 4*sizeof(int),
.mode = 0644,
- .proc_handler = proc_dointvec,
+ .proc_handler = proc_dointvec_printk_deprecated,
},
{
.procname = "printk_ratelimit",
--
2.51.2
Powered by blists - more mailing lists