Provide an escape hatch for debugging kdump failures that may involve pre-kdump callbacks. Add panic_pre_kdump_postpone to skip their early invocation in crash core without consuming the once-only guard.
When enabled, the chain runs before kdump only when crash_kexec_post_notifiers is also enabled. Leave the late panic call unchanged so callbacks remain eligible if that path is reached. Skipping the callbacks may prevent hypervisor crash handling. Suggested-by: Guilherme G. Piccoli <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Zack Rusin <[email protected]> --- New in v2: optional postponement policy suggested by Guilherme. Documentation/admin-guide/kernel-parameters.txt | 14 ++++++++++++++ include/linux/panic_notifier.h | 1 + kernel/crash_core.c | 3 ++- kernel/panic.c | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 33cd30996e47..3d722df30838 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -4904,6 +4904,20 @@ Kernel parameters This option should only be used for systems with the above constraints as it might cause the panic operation to be less reliable. + panic_pre_kdump_postpone= + [KNL] Defer pre-kdump notifiers to the late panic path. + They run before kdump only when + crash_kexec_post_notifiers is also enabled. If panic + reaches the late path without entering kdump, they + can still run there. + Intended for debugging kexec/crash-dump failures. + Skipping these callbacks may prevent correct crash + handling by the hypervisor. + Format: <bool> + Default: 0 + Writable at runtime via + /sys/module/kernel/parameters/panic_pre_kdump_postpone. + panic_print= Bitmask for printing system info when panic happens. User can chose combination of the following bits: diff --git a/include/linux/panic_notifier.h b/include/linux/panic_notifier.h index 3ad390764a41..655ee5c77181 100644 --- a/include/linux/panic_notifier.h +++ b/include/linux/panic_notifier.h @@ -11,5 +11,6 @@ extern struct atomic_notifier_head panic_pre_kdump_list; void panic_notify_pre_kdump(char *msg); extern bool crash_kexec_post_notifiers; +extern bool panic_pre_kdump_postpone; #endif /* _LINUX_PANIC_NOTIFIERS_H */ diff --git a/kernel/crash_core.c b/kernel/crash_core.c index 5d9fe9e00f39..d6b2293dd0fe 100644 --- a/kernel/crash_core.c +++ b/kernel/crash_core.c @@ -140,7 +140,8 @@ void __noclone __crash_kexec(struct pt_regs *regs) struct pt_regs fixed_regs; crash_setup_regs(&fixed_regs, regs); - panic_notify_pre_kdump(NULL); + if (!READ_ONCE(panic_pre_kdump_postpone)) + panic_notify_pre_kdump(NULL); crash_save_vmcoreinfo(); machine_crash_shutdown(&fixed_regs); crash_cma_clear_pending_dma(); diff --git a/kernel/panic.c b/kernel/panic.c index d78e90abb192..65d86594e038 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -62,6 +62,7 @@ static int pause_on_oops; static int pause_on_oops_flag; static DEFINE_SPINLOCK(pause_on_oops_lock); bool crash_kexec_post_notifiers; +bool panic_pre_kdump_postpone; int panic_on_warn __read_mostly; unsigned long panic_on_taint; bool panic_on_taint_nousertaint = false; @@ -1243,6 +1244,7 @@ core_param(panic, panic_timeout, int, 0644); core_param(pause_on_oops, pause_on_oops, int, 0644); core_param(panic_on_warn, panic_on_warn, int, 0644); core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644); +core_param(panic_pre_kdump_postpone, panic_pre_kdump_postpone, bool, 0644); core_param(panic_console_replay, panic_console_replay, bool, 0644); static int panic_print_set(const char *val, const struct kernel_param *kp)

