| From: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Subject: panic: remove redundant panic-cpu backtrace |
| Date: Wed, 3 Sep 2025 12:04:18 +0200 |
| |
| Backtraces from all CPUs are printed during panic() when |
| SYS_INFO_ALL_CPU_BT is set. It shows the backtrace for the panic-CPU even |
| when it has already been explicitly printed before. |
| |
| Do not change the legacy code which prints the backtrace in various |
| contexts, for example, as part of Oops report, right after panic message. |
| It will always be visible in the crash dump. |
| |
| Instead, remember when the backtrace was printed, and skip it when dumping |
| the optional backtraces on all CPUs. |
| |
| [akpm@linux-foundation.org: make panic_this_cpu_backtrace_printed static] |
| Closes: https://lore.kernel.org/oe-kbuild-all/202509050048.FMpVvh1u-lkp@intel.com/ |
| [pmladek@suse.com: Handle situations when the backtrace was not printed for the panic CPU] |
| Link: https://lkml.kernel.org/r/20250903100418.410026-1-pmladek@suse.com |
| Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Link: https://lore.kernel.org/r/20250731030314.3818040-1-senozhatsky@chromium.org |
| Signed-off-by: Petr Mladek <pmladek@suse.com> |
| Tested-by: Feng Tang <feng.tang@linux.alibaba.com> |
| Reviewed-by: John Ogness <john.ogness@linutronix.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/panic.c | 30 +++++++++++++++++++++--------- |
| 1 file changed, 21 insertions(+), 9 deletions(-) |
| |
| --- a/kernel/panic.c~panic-remove-redundant-panic-cpu-backtrace |
| +++ a/kernel/panic.c |
| @@ -67,6 +67,7 @@ static unsigned int warn_limit __read_mo |
| static bool panic_console_replay; |
| |
| bool panic_triggering_all_cpu_backtrace; |
| +static bool panic_this_cpu_backtrace_printed; |
| |
| int panic_timeout = CONFIG_PANIC_TIMEOUT; |
| EXPORT_SYMBOL_GPL(panic_timeout); |
| @@ -380,6 +381,19 @@ void check_panic_on_warn(const char *ori |
| origin, limit); |
| } |
| |
| +static void panic_trigger_all_cpu_backtrace(void) |
| +{ |
| + /* Temporary allow non-panic CPUs to write their backtraces. */ |
| + panic_triggering_all_cpu_backtrace = true; |
| + |
| + if (panic_this_cpu_backtrace_printed) |
| + trigger_allbutcpu_cpu_backtrace(raw_smp_processor_id()); |
| + else |
| + trigger_all_cpu_backtrace(); |
| + |
| + panic_triggering_all_cpu_backtrace = false; |
| +} |
| + |
| /* |
| * Helper that triggers the NMI backtrace (if set in panic_print) |
| * and then performs the secondary CPUs shutdown - we cannot have |
| @@ -387,12 +401,8 @@ void check_panic_on_warn(const char *ori |
| */ |
| static void panic_other_cpus_shutdown(bool crash_kexec) |
| { |
| - if (panic_print & SYS_INFO_ALL_CPU_BT) { |
| - /* Temporary allow non-panic CPUs to write their backtraces. */ |
| - panic_triggering_all_cpu_backtrace = true; |
| - trigger_all_cpu_backtrace(); |
| - panic_triggering_all_cpu_backtrace = false; |
| - } |
| + if (panic_print & SYS_INFO_ALL_CPU_BT) |
| + panic_trigger_all_cpu_backtrace(); |
| |
| /* |
| * Note that smp_send_stop() is the usual SMP shutdown function, |
| @@ -470,13 +480,15 @@ void vpanic(const char *fmt, va_list arg |
| buf[len - 1] = '\0'; |
| |
| pr_emerg("Kernel panic - not syncing: %s\n", buf); |
| -#ifdef CONFIG_DEBUG_BUGVERBOSE |
| /* |
| * Avoid nested stack-dumping if a panic occurs during oops processing |
| */ |
| - if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) |
| + if (test_taint(TAINT_DIE) || oops_in_progress > 1) { |
| + panic_this_cpu_backtrace_printed = true; |
| + } else if (IS_ENABLED(CONFIG_DEBUG_BUGVERBOSE)) { |
| dump_stack(); |
| -#endif |
| + panic_this_cpu_backtrace_printed = true; |
| + } |
| |
| /* |
| * If kgdb is enabled, give it a chance to run before we stop all |
| _ |