[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250713-nbcon-kgdboc-v1-2-51eccd9247a8@suse.com>
Date: Sun, 13 Jul 2025 02:09:19 -0300
From: Marcos Paulo de Souza <mpdesouza@...e.com>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Petr Mladek <pmladek@...e.com>, Steven Rostedt <rostedt@...dmis.org>,
John Ogness <john.ogness@...utronix.de>,
Sergey Senozhatsky <senozhatsky@...omium.org>,
Jason Wessel <jason.wessel@...driver.com>,
Daniel Thompson <danielt@...nel.org>,
Douglas Anderson <dianders@...omium.org>
Cc: linux-kernel@...r.kernel.org, kgdb-bugreport@...ts.sourceforge.net,
Marcos Paulo de Souza <mpdesouza@...e.com>
Subject: [PATCH 2/2] kdb: Adapt kdb_msg_write to work with NBCON consoles
Function kdb_msg_write was calling con->write for the any found console,
but it won't work on NBCON ones. In this case we should acquire the
ownership of the console using NBCON_PRIO_EMERGENCY, since printing
kdb messages should only be interrupted by a panic.
At this point, the console is required to use the atomic callback. The
console is skipped if the write_atomic callback is not set or if the
context could not be acquired. The validation of NBCON is done by the
console_is_usable helper. The context is released right after
write_atomic finishes.
Suggested-by: Petr Mladek <pmladek@...e.com>
Signed-off-by: Marcos Paulo de Souza <mpdesouza@...e.com>
---
kernel/debug/kdb/kdb_io.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 42 insertions(+), 4 deletions(-)
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 9b11b10b120cf07e451a7a4d92ce50f9a6c066b2..3b7365c11d06b01d487767fd89f1081da10dd2ed 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -558,6 +558,25 @@ static int kdb_search_string(char *searched, char *searchfor)
return 0;
}
+static struct nbcon_context *nbcon_acquire_ctxt(struct console *con,
+ struct nbcon_write_context *wctxt,
+ char *msg, int msg_len)
+{
+ struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
+
+ ctxt->console = con;
+ ctxt->spinwait_max_us = 0;
+ ctxt->prio = NBCON_PRIO_EMERGENCY;
+ ctxt->allow_unsafe_takeover = false;
+ wctxt->outbuf = msg;
+ wctxt->len = msg_len;
+
+ if (!nbcon_context_try_acquire(ctxt))
+ return NULL;
+
+ return ctxt;
+}
+
static void kdb_msg_write(const char *msg, int msg_len)
{
struct console *c;
@@ -589,12 +608,26 @@ static void kdb_msg_write(const char *msg, int msg_len)
*/
cookie = console_srcu_read_lock();
for_each_console_srcu(c) {
- if (!(console_srcu_read_flags(c) & CON_ENABLED))
+ struct nbcon_write_context wctxt = { };
+ struct nbcon_context *ctxt;
+ short flags = console_srcu_read_flags(c);
+
+ if (!console_is_usable(c, flags, true))
continue;
if (c == dbg_io_ops->cons)
continue;
- if (!c->write)
- continue;
+
+ /*
+ * Do not continue if the console is NBCON and the context
+ * can't be acquired.
+ */
+ if (flags & CON_NBCON) {
+ ctxt = nbcon_acquire_ctxt(c, &wctxt, (char *)msg,
+ msg_len);
+ if (!ctxt)
+ continue;
+ }
+
/*
* Set oops_in_progress to encourage the console drivers to
* disregard their internal spin locks: in the current calling
@@ -605,7 +638,12 @@ static void kdb_msg_write(const char *msg, int msg_len)
* for this calling context.
*/
++oops_in_progress;
- c->write(c, msg, msg_len);
+ if (flags & CON_NBCON) {
+ c->write_atomic(c, &wctxt);
+ nbcon_context_release(ctxt);
+ } else {
+ c->write(c, msg, msg_len);
+ }
--oops_in_progress;
touch_nmi_watchdog();
}
--
2.50.0
Powered by blists - more mailing lists