On Thu, Nov 13, 2025 at 05:09:48PM +0106, John Ogness wrote:
@sherry.sun: This patch is essentially the same as v1, but since two WARN_ON_ONCE() were added, I decided not to use your Tested-by. It would be great if you could test again with this series.
kernel/printk/internal.h | 8 +++--- kernel/printk/nbcon.c | 7 +++++ kernel/printk/printk.c | 58 +++++++++++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 18 deletions(-)
diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index 73f315fd97a3e..730d14f6cbc58 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -1276,6 +1276,13 @@ void nbcon_kthreads_wake(void) if (!printk_kthreads_running) return;
- /*
* It is not allowed to call this function when console irq_work* is blocked.*/- if (WARN_ON_ONCE(console_irqwork_blocked))
return;
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index dc89239cf1b58..b1c0d35cf3caa 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -462,6 +462,9 @@ bool have_boot_console; /* See printk_legacy_allow_panic_sync() for details. */ bool legacy_allow_panic_sync; +/* Avoid using irq_work when suspending. */ +bool console_irqwork_blocked;
#ifdef CONFIG_PRINTK DECLARE_WAIT_QUEUE_HEAD(log_wait); static DECLARE_WAIT_QUEUE_HEAD(legacy_wait); @@ -2426,7 +2429,7 @@ asmlinkage int vprintk_emit(int facility, int level, if (ft.legacy_offload) defer_console_output();
- else
- else if (!console_irqwork_blocked) wake_up_klogd();
return printed_len; @@ -2730,10 +2733,20 @@ void console_suspend_all(void) { struct console *con;
- if (console_suspend_enabled)
pr_info("Suspending console(s) (use no_console_suspend to debug)\n");- /*
* Flush any console backlog and then avoid queueing irq_work until* console_resume_all(). Until then deferred printing is no longer* triggered, NBCON consoles transition to atomic flushing, and* any klogd waiters are not triggered.*/- pr_flush(1000, true);
- console_irqwork_blocked = true;
Thanks for this. I have recently have been seeing the same issue with a large-CPU workstation system in which the serial console been locking up entry/exit of S4 Hibernation sleep state at different intervals.
I am still running tests on the V1 of the series to determine reproducibility, but I will try to get this version tested in a timely manner as well.
I did, however, test the proto-patch at [0]. The original issue was reproducible with this patch applied. Avoiding klogd waking in vprintk_emit() and the addition of the check in nbcon.c (new in this series) opposed to aborting callers outright seems more airtight.
[0] https://github.com/Linutronix/linux/commit/ae173249d9028ef159fba040bdab260d8...