Function kdb_msg_write was calling con->write for any found console,
but it won't work on NBCON consoles. 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.
The oops_in_progress handling is only needed in the legacy consoles,
so it was moved around the con->write callback.
Suggested-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: John Ogness <john.ogness@linutronix.de>
Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
kernel/debug/kdb/kdb_io.c | 47 ++++++++++++++++++++++++++++++++---------------
1 file changed, 32 insertions(+), 15 deletions(-)
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index b12b9db75c1d..61c1690058ed 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -589,24 +589,41 @@ 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))
+ 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;
- /*
- * Set oops_in_progress to encourage the console drivers to
- * disregard their internal spin locks: in the current calling
- * context the risk of deadlock is a bigger problem than risks
- * due to re-entering the console driver. We operate directly on
- * oops_in_progress rather than using bust_spinlocks() because
- * the calls bust_spinlocks() makes on exit are not appropriate
- * for this calling context.
- */
- ++oops_in_progress;
- c->write(c, msg, msg_len);
- --oops_in_progress;
+
+ if (flags & CON_NBCON) {
+ struct nbcon_write_context wctxt = { };
+
+ /*
+ * Do not continue if the console is NBCON and the context
+ * can't be acquired.
+ */
+ if (!nbcon_kdb_try_acquire(c, &wctxt))
+ continue;
+
+ nbcon_write_context_set_buf(&wctxt, (char *)msg, msg_len);
+
+ c->write_atomic(c, &wctxt);
+ nbcon_kdb_release(&wctxt);
+ } else {
+ /*
+ * Set oops_in_progress to encourage the console drivers to
+ * disregard their internal spin locks: in the current calling
+ * context the risk of deadlock is a bigger problem than risks
+ * due to re-entering the console driver. We operate directly on
+ * oops_in_progress rather than using bust_spinlocks() because
+ * the calls bust_spinlocks() makes on exit are not appropriate
+ * for this calling context.
+ */
+ ++oops_in_progress;
+ c->write(c, msg, msg_len);
+ --oops_in_progress;
+ }
touch_nmi_watchdog();
}
console_srcu_read_unlock(cookie);
--
2.51.0
Hi Marcos,
kernel test robot noticed the following build errors:
[auto build test ERROR on 3a8660878839faadb4f1a6dd72c3179c1df56787]
url: https://github.com/intel-lab-lkp/linux/commits/Marcos-Paulo-de-Souza/printk-nbcon-Export-console_is_usable/20251016-225503
base: 3a8660878839faadb4f1a6dd72c3179c1df56787
patch link: https://lore.kernel.org/r/20251016-nbcon-kgdboc-v6-5-866aac60a80e%40suse.com
patch subject: [PATCH v6 5/5] kdb: Adapt kdb_msg_write to work with NBCON consoles
config: sh-randconfig-002-20251017 (https://download.01.org/0day-ci/archive/20251017/202510171450.G2KdvDMm-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251017/202510171450.G2KdvDMm-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510171450.G2KdvDMm-lkp@intel.com/
All errors (new ones prefixed by >>):
kernel/debug/kdb/kdb_io.c: In function 'kdb_msg_write':
>> kernel/debug/kdb/kdb_io.c:612:43: error: passing argument 1 of 'nbcon_kdb_release' from incompatible pointer type [-Wincompatible-pointer-types]
612 | nbcon_kdb_release(&wctxt);
| ^~~~~~
| |
| struct nbcon_write_context *
In file included from kernel/debug/kdb/kdb_io.c:17:
include/linux/console.h:667:54: note: expected 'struct console *' but argument is of type 'struct nbcon_write_context *'
667 | static inline void nbcon_kdb_release(struct console *con) { }
| ~~~~~~~~~~~~~~~~^~~
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for I2C_K1
Depends on [n]: I2C [=y] && HAS_IOMEM [=y] && (ARCH_SPACEMIT || COMPILE_TEST [=y]) && OF [=n]
Selected by [y]:
- MFD_SPACEMIT_P1 [=y] && HAS_IOMEM [=y] && (ARCH_SPACEMIT || COMPILE_TEST [=y]) && I2C [=y]
vim +/nbcon_kdb_release +612 kernel/debug/kdb/kdb_io.c
560
561 static void kdb_msg_write(const char *msg, int msg_len)
562 {
563 struct console *c;
564 const char *cp;
565 int cookie;
566 int len;
567
568 if (msg_len == 0)
569 return;
570
571 cp = msg;
572 len = msg_len;
573
574 while (len--) {
575 dbg_io_ops->write_char(*cp);
576 cp++;
577 }
578
579 /*
580 * The console_srcu_read_lock() only provides safe console list
581 * traversal. The use of the ->write() callback relies on all other
582 * CPUs being stopped at the moment and console drivers being able to
583 * handle reentrance when @oops_in_progress is set.
584 *
585 * There is no guarantee that every console driver can handle
586 * reentrance in this way; the developer deploying the debugger
587 * is responsible for ensuring that the console drivers they
588 * have selected handle reentrance appropriately.
589 */
590 cookie = console_srcu_read_lock();
591 for_each_console_srcu(c) {
592 short flags = console_srcu_read_flags(c);
593
594 if (!console_is_usable(c, flags, true))
595 continue;
596 if (c == dbg_io_ops->cons)
597 continue;
598
599 if (flags & CON_NBCON) {
600 struct nbcon_write_context wctxt = { };
601
602 /*
603 * Do not continue if the console is NBCON and the context
604 * can't be acquired.
605 */
606 if (!nbcon_kdb_try_acquire(c, &wctxt))
607 continue;
608
609 nbcon_write_context_set_buf(&wctxt, (char *)msg, msg_len);
610
611 c->write_atomic(c, &wctxt);
> 612 nbcon_kdb_release(&wctxt);
613 } else {
614 /*
615 * Set oops_in_progress to encourage the console drivers to
616 * disregard their internal spin locks: in the current calling
617 * context the risk of deadlock is a bigger problem than risks
618 * due to re-entering the console driver. We operate directly on
619 * oops_in_progress rather than using bust_spinlocks() because
620 * the calls bust_spinlocks() makes on exit are not appropriate
621 * for this calling context.
622 */
623 ++oops_in_progress;
624 c->write(c, msg, msg_len);
625 --oops_in_progress;
626 }
627 touch_nmi_watchdog();
628 }
629 console_srcu_read_unlock(cookie);
630 }
631
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Marcos,
kernel test robot noticed the following build errors:
[auto build test ERROR on 3a8660878839faadb4f1a6dd72c3179c1df56787]
url: https://github.com/intel-lab-lkp/linux/commits/Marcos-Paulo-de-Souza/printk-nbcon-Export-console_is_usable/20251016-225503
base: 3a8660878839faadb4f1a6dd72c3179c1df56787
patch link: https://lore.kernel.org/r/20251016-nbcon-kgdboc-v6-5-866aac60a80e%40suse.com
patch subject: [PATCH v6 5/5] kdb: Adapt kdb_msg_write to work with NBCON consoles
config: i386-buildonly-randconfig-006-20251017 (https://download.01.org/0day-ci/archive/20251017/202510171023.YREXxhMK-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251017/202510171023.YREXxhMK-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510171023.YREXxhMK-lkp@intel.com/
All errors (new ones prefixed by >>):
>> kernel/debug/kdb/kdb_io.c:612:22: error: incompatible pointer types passing 'struct nbcon_write_context *' to parameter of type 'struct console *' [-Werror,-Wincompatible-pointer-types]
612 | nbcon_kdb_release(&wctxt);
| ^~~~~~
include/linux/console.h:667:54: note: passing argument to parameter 'con' here
667 | static inline void nbcon_kdb_release(struct console *con) { }
| ^
1 error generated.
vim +612 kernel/debug/kdb/kdb_io.c
560
561 static void kdb_msg_write(const char *msg, int msg_len)
562 {
563 struct console *c;
564 const char *cp;
565 int cookie;
566 int len;
567
568 if (msg_len == 0)
569 return;
570
571 cp = msg;
572 len = msg_len;
573
574 while (len--) {
575 dbg_io_ops->write_char(*cp);
576 cp++;
577 }
578
579 /*
580 * The console_srcu_read_lock() only provides safe console list
581 * traversal. The use of the ->write() callback relies on all other
582 * CPUs being stopped at the moment and console drivers being able to
583 * handle reentrance when @oops_in_progress is set.
584 *
585 * There is no guarantee that every console driver can handle
586 * reentrance in this way; the developer deploying the debugger
587 * is responsible for ensuring that the console drivers they
588 * have selected handle reentrance appropriately.
589 */
590 cookie = console_srcu_read_lock();
591 for_each_console_srcu(c) {
592 short flags = console_srcu_read_flags(c);
593
594 if (!console_is_usable(c, flags, true))
595 continue;
596 if (c == dbg_io_ops->cons)
597 continue;
598
599 if (flags & CON_NBCON) {
600 struct nbcon_write_context wctxt = { };
601
602 /*
603 * Do not continue if the console is NBCON and the context
604 * can't be acquired.
605 */
606 if (!nbcon_kdb_try_acquire(c, &wctxt))
607 continue;
608
609 nbcon_write_context_set_buf(&wctxt, (char *)msg, msg_len);
610
611 c->write_atomic(c, &wctxt);
> 612 nbcon_kdb_release(&wctxt);
613 } else {
614 /*
615 * Set oops_in_progress to encourage the console drivers to
616 * disregard their internal spin locks: in the current calling
617 * context the risk of deadlock is a bigger problem than risks
618 * due to re-entering the console driver. We operate directly on
619 * oops_in_progress rather than using bust_spinlocks() because
620 * the calls bust_spinlocks() makes on exit are not appropriate
621 * for this calling context.
622 */
623 ++oops_in_progress;
624 c->write(c, msg, msg_len);
625 --oops_in_progress;
626 }
627 touch_nmi_watchdog();
628 }
629 console_srcu_read_unlock(cookie);
630 }
631
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Fri 2025-10-17 10:17:37, kernel test robot wrote:
> Hi Marcos,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on 3a8660878839faadb4f1a6dd72c3179c1df56787]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Marcos-Paulo-de-Souza/printk-nbcon-Export-console_is_usable/20251016-225503
> base: 3a8660878839faadb4f1a6dd72c3179c1df56787
> patch link: https://lore.kernel.org/r/20251016-nbcon-kgdboc-v6-5-866aac60a80e%40suse.com
> patch subject: [PATCH v6 5/5] kdb: Adapt kdb_msg_write to work with NBCON consoles
> config: i386-buildonly-randconfig-006-20251017 (https://download.01.org/0day-ci/archive/20251017/202510171023.YREXxhMK-lkp@intel.com/config)
> compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251017/202510171023.YREXxhMK-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202510171023.YREXxhMK-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> >> kernel/debug/kdb/kdb_io.c:612:22: error: incompatible pointer types passing 'struct nbcon_write_context *' to parameter of type 'struct console *' [-Werror,-Wincompatible-pointer-types]
> 612 | nbcon_kdb_release(&wctxt);
> | ^~~~~~
> include/linux/console.h:667:54: note: passing argument to parameter 'con' here
> 667 | static inline void nbcon_kdb_release(struct console *con) { }
This should be:
static inline void nbcon_kdb_release(struct nbcon_write_context *wctxt) { }
Again, no need for v7. I could fix this when committing the patch.
Best Regards,
Petr
© 2016 - 2025 Red Hat, Inc.