[PATCH v2 3/6] panic: Allow postponing pre-kdump notifiers
Zack Rusin
zack.rusin at broadcom.com
Mon Sep 28 10:55:37 PDT 2026
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 <gpiccoli at igalia.com>
Link: https://lore.kernel.org/r/bc0bdd14-5e6a-0676-cd04-14fb0bb93cd5@igalia.com
Signed-off-by: Zack Rusin <zack.rusin at broadcom.com>
---
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)
More information about the kexec
mailing list