| From 2fbdf981bab228903bd57cbfc603361421aee0af Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 7 Feb 2024 14:47:02 +0106 |
| Subject: panic: Flush kernel log buffer at the end |
| |
| From: John Ogness <john.ogness@linutronix.de> |
| |
| [ Upstream commit d988d9a9b9d180bfd5c1d353b3b176cb90d6861b ] |
| |
| If the kernel crashes in a context where printk() calls always |
| defer printing (such as in NMI or inside a printk_safe section) |
| then the final panic messages will be deferred to irq_work. But |
| if irq_work is not available, the messages will not get printed |
| unless explicitly flushed. The result is that the final |
| "end Kernel panic" banner does not get printed. |
| |
| Add one final flush after the last printk() call to make sure |
| the final panic messages make it out as well. |
| |
| Signed-off-by: John Ogness <john.ogness@linutronix.de> |
| Reviewed-by: Petr Mladek <pmladek@suse.com> |
| Link: https://lore.kernel.org/r/20240207134103.1357162-14-john.ogness@linutronix.de |
| Signed-off-by: Petr Mladek <pmladek@suse.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/panic.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| diff --git a/kernel/panic.c b/kernel/panic.c |
| index 47933d4c769b6..3b14c6d123ddc 100644 |
| --- a/kernel/panic.c |
| +++ b/kernel/panic.c |
| @@ -425,6 +425,14 @@ void panic(const char *fmt, ...) |
| |
| /* Do not scroll important messages printed above */ |
| suppress_printk = 1; |
| + |
| + /* |
| + * The final messages may not have been printed if in a context that |
| + * defers printing (such as NMI) and irq_work is not available. |
| + * Explicitly flush the kernel log buffer one last time. |
| + */ |
| + console_flush_on_panic(CONSOLE_FLUSH_PENDING); |
| + |
| local_irq_enable(); |
| for (i = 0; ; i += PANIC_TIMER_STEP) { |
| touch_softlockup_watchdog(); |
| -- |
| 2.43.0 |
| |