* [PATCH 0/2] printk: Introduce loglevel bypass for pstore console
@ 2026-08-31 7:03 Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 1/2] printk: Introduce CON_BYPASS_LOGLEVEL flag Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 2/2] pstore: Bypass loglevel suppression for pstore console Tzung-Bi Shih
0 siblings, 2 replies; 3+ messages in thread
From: Tzung-Bi Shih @ 2026-08-31 7:03 UTC (permalink / raw)
To: Kees Cook, Greg Kroah-Hartman, Petr Mladek
Cc: Tony Luck, Guilherme G. Piccoli, Steven Rostedt, John Ogness,
Sergey Senozhatsky, tzungbi, tfiga, linux-kernel
Currently, offline consoles (e.g., pstore_console backed by ramoops)
inherit the system's global console_loglevel.
In production environments, physical serial consoles (UARTs) are often
heavily rate-limited to prevent verbose messages from causing severe
execution bottlenecks. Unfortunately, this identically silences the
pstore console. When a kernel panic or lockup occurs, engineers are
left inspecting a crash dump that has been stripped of the verbose logs
that could have identified the root cause.
This series introduces CON_BYPASS_LOGLEVEL, a simple flag that allows
specialized offline consoles to request unsuppressed logs directly.
Patch 1 introduces the CON_BYPASS_LOGLEVEL flag.
Patch 2 adopts the flag in pstore_console.
Tzung-Bi Shih (2):
printk: Introduce CON_BYPASS_LOGLEVEL flag
pstore: Bypass loglevel suppression for pstore console
fs/pstore/platform.c | 4 ++++
fs/pstore/ram.c | 3 ++-
include/linux/console.h | 4 ++++
include/linux/pstore.h | 2 ++
kernel/printk/nbcon.c | 7 +++++--
kernel/printk/printk.c | 6 ++++--
6 files changed, 21 insertions(+), 5 deletions(-)
--
2.55.0.897.gb25b4bd76c-goog
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] printk: Introduce CON_BYPASS_LOGLEVEL flag
2026-08-31 7:03 [PATCH 0/2] printk: Introduce loglevel bypass for pstore console Tzung-Bi Shih
@ 2026-08-31 7:03 ` Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 2/2] pstore: Bypass loglevel suppression for pstore console Tzung-Bi Shih
1 sibling, 0 replies; 3+ messages in thread
From: Tzung-Bi Shih @ 2026-08-31 7:03 UTC (permalink / raw)
To: Kees Cook, Greg Kroah-Hartman, Petr Mladek
Cc: Tony Luck, Guilherme G. Piccoli, Steven Rostedt, John Ogness,
Sergey Senozhatsky, tzungbi, tfiga, linux-kernel
Currently, offline consoles (e.g., pstore_console backed by ramoops)
inherently rely on the global `console_loglevel` setting. If a system
is configured with a quiet serial console, the pstore console is
silenced as well. Consequently, during a panic or lockup, relevant
verbose logs leading up to the crash are lost.
Introduce the `CON_BYPASS_LOGLEVEL` flag to allow consoles to bypass log
level suppression.
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
---
include/linux/console.h | 4 ++++
kernel/printk/nbcon.c | 7 +++++--
kernel/printk/printk.c | 6 ++++--
3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/include/linux/console.h b/include/linux/console.h
index d624200cfc17..00ce21d73256 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -180,6 +180,9 @@ static inline void con_debug_leave(void) { }
* constraints.
* @CON_NBCON_ATOMIC_UNSAFE: The write_atomic() callback is not safe and is
* therefore only used by nbcon_atomic_flush_unsafe().
+ * @CON_BYPASS_LOGLEVEL The console bypasses loglevel filtering. Every message
+ * in the ringbuffer is emitted, regardless of the global
+ * console_loglevel setting.
*/
enum cons_flags {
CON_PRINTBUFFER = BIT(0),
@@ -192,6 +195,7 @@ enum cons_flags {
CON_SUSPENDED = BIT(7),
CON_NBCON = BIT(8),
CON_NBCON_ATOMIC_UNSAFE = BIT(9),
+ CON_BYPASS_LOGLEVEL = BIT(10),
};
/**
diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c
index 4b03b019cd5e..bb5669cbf51b 100644
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -981,7 +981,9 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt, bool use_a
{
struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
struct console *con = ctxt->console;
- bool is_extended = console_srcu_read_flags(con) & CON_EXTENDED;
+ short console_flags = console_srcu_read_flags(con);
+ bool is_extended = console_flags & CON_EXTENDED;
+ bool may_suppress = !(console_flags & CON_BYPASS_LOGLEVEL);
struct printk_message pmsg = {
.pbufs = ctxt->pbufs,
};
@@ -1014,7 +1016,8 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt, bool use_a
if (!nbcon_context_enter_unsafe(ctxt))
return false;
- ctxt->backlog = printk_get_next_message(&pmsg, ctxt->seq, is_extended, true);
+ ctxt->backlog = printk_get_next_message(&pmsg, ctxt->seq, is_extended,
+ may_suppress);
if (!ctxt->backlog)
return nbcon_context_exit_unsafe(ctxt);
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 3fcdf4b4e2e5..b8a7a8b69af7 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -3125,7 +3125,9 @@ struct printk_buffers printk_shared_pbufs;
*/
static bool console_emit_next_record(struct console *con, bool *handover, int cookie)
{
- bool is_extended = console_srcu_read_flags(con) & CON_EXTENDED;
+ short console_flags = console_srcu_read_flags(con);
+ bool is_extended = console_flags & CON_EXTENDED;
+ bool may_suppress = !(console_flags & CON_BYPASS_LOGLEVEL);
char *outbuf = &printk_shared_pbufs.outbuf[0];
struct printk_message pmsg = {
.pbufs = &printk_shared_pbufs,
@@ -3134,7 +3136,7 @@ static bool console_emit_next_record(struct console *con, bool *handover, int co
*handover = false;
- if (!printk_get_next_message(&pmsg, con->seq, is_extended, true))
+ if (!printk_get_next_message(&pmsg, con->seq, is_extended, may_suppress))
return false;
con->dropped += pmsg.dropped;
--
2.55.0.897.gb25b4bd76c-goog
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] pstore: Bypass loglevel suppression for pstore console
2026-08-31 7:03 [PATCH 0/2] printk: Introduce loglevel bypass for pstore console Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 1/2] printk: Introduce CON_BYPASS_LOGLEVEL flag Tzung-Bi Shih
@ 2026-08-31 7:03 ` Tzung-Bi Shih
1 sibling, 0 replies; 3+ messages in thread
From: Tzung-Bi Shih @ 2026-08-31 7:03 UTC (permalink / raw)
To: Kees Cook, Greg Kroah-Hartman, Petr Mladek
Cc: Tony Luck, Guilherme G. Piccoli, Steven Rostedt, John Ogness,
Sergey Senozhatsky, tzungbi, tfiga, linux-kernel
The pstore console largely serves to continuously dump kernel messages
to persistent backends (e.g., ramoops). Currently, it inherits the
global `console_loglevel` constraints. Relevant verbose logs could be
omitted from a crash dump if the system uses a strict log level to
prevent spam and bottlenecks.
Unlike physical consoles, writing records to RAM (ramoops) is extremely
fast. Applying loglevel limits to pstore provides no system performance
benefit, but sometimes costs engineers the crucial verbose debugging
context leading up to a kernel panic or lockup.
Introduce `PSTORE_FLAGS_CONSOLE_BYPASS_LOGLEVEL` to allow fast pstore
backends to capture full and unsuppressed logs directly regardless of
the system's global loglevel setting. Opt-in for `ramoops`.
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
---
fs/pstore/platform.c | 4 ++++
fs/pstore/ram.c | 3 ++-
include/linux/pstore.h | 2 ++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 1d76c9d92056..88b894163b25 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -421,6 +421,10 @@ static void pstore_register_console(void)
* calls may have changed settings (specifically CON_ENABLED).
*/
pstore_console.flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME;
+
+ if (psinfo->flags & PSTORE_FLAGS_CONSOLE_BYPASS_LOGLEVEL)
+ pstore_console.flags |= CON_BYPASS_LOGLEVEL;
+
register_console(&pstore_console);
}
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index 2eb0d4fa2186..945dd55be97a 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -825,7 +825,8 @@ static int ramoops_probe(struct platform_device *pdev)
cxt->pstore.max_reason = pdata->max_reason;
}
if (cxt->console_size)
- cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE;
+ cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE |
+ PSTORE_FLAGS_CONSOLE_BYPASS_LOGLEVEL;
if (cxt->max_ftrace_cnt)
cxt->pstore.flags |= PSTORE_FLAGS_FTRACE;
if (cxt->pmsg_size)
diff --git a/include/linux/pstore.h b/include/linux/pstore.h
index fed601053c51..34b4acfa21ce 100644
--- a/include/linux/pstore.h
+++ b/include/linux/pstore.h
@@ -206,6 +206,8 @@ struct pstore_info {
#define PSTORE_FLAGS_CONSOLE BIT(1)
#define PSTORE_FLAGS_FTRACE BIT(2)
#define PSTORE_FLAGS_PMSG BIT(3)
+/* Bypass loglevel for fast consoles */
+#define PSTORE_FLAGS_CONSOLE_BYPASS_LOGLEVEL BIT(4)
extern int pstore_register(struct pstore_info *);
extern void pstore_unregister(struct pstore_info *);
--
2.55.0.897.gb25b4bd76c-goog
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-31 7:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-31 7:03 [PATCH 0/2] printk: Introduce loglevel bypass for pstore console Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 1/2] printk: Introduce CON_BYPASS_LOGLEVEL flag Tzung-Bi Shih
2026-08-31 7:03 ` [PATCH 2/2] pstore: Bypass loglevel suppression for pstore console Tzung-Bi Shih
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®