| From fb43ba4256543ce18ca0540fc37022bda438a293 Mon Sep 17 00:00:00 2001 |
| From: Sourabh Jain <sourabhjain@linux.ibm.com> |
| Date: Mon, 27 Jul 2026 11:04:16 +0530 |
| Subject: powerpc/crash: stop watchdogs before booting kdump kernel |
| |
| From: Sourabh Jain <sourabhjain@linux.ibm.com> |
| |
| commit fb43ba4256543ce18ca0540fc37022bda438a293 upstream. |
| |
| On pseries LPAR systems, watchdog timers configured from userspace can |
| remain active after a kernel panic. When a panic triggers kdump, the |
| crashing kernel jumps directly to the kdump kernel without stopping |
| active watchdogs. As a result, the watchdogs remain active after the |
| kdump kernel starts. |
| |
| If dump capture takes longer than the watchdog timeout, PHYP resets the |
| LPAR before the dump is fully captured, causing dump capture to fail. |
| |
| Fix this by issuing the `H_WATCHDOG` hcall during the crash shutdown |
| sequence to stop all active watchdogs before booting the kdump kernel. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 69472ffa6575 ("watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers") |
| Reported-by: Mahesh Kumar G <mahe657@linux.ibm.com> |
| Suggested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> |
| Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> |
| Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com> |
| Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> |
| Link: https://patch.msgid.link/20260727053416.276317-4-sourabhjain@linux.ibm.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/powerpc/include/asm/papr-watchdog.h | 6 ++++++ |
| arch/powerpc/platforms/pseries/setup.c | 14 ++++++++++++++ |
| 2 files changed, 20 insertions(+) |
| |
| --- a/arch/powerpc/include/asm/papr-watchdog.h |
| +++ b/arch/powerpc/include/asm/papr-watchdog.h |
| @@ -22,6 +22,12 @@ |
| #define PSERIES_WDTF_ACTION_DUMP_RESTART 0x3UL /* dump + restart */ |
| |
| /* |
| + * R5: "watchdogNumber": |
| + * PAPR says use -1 (all ones) to stop all watchdogs. |
| + */ |
| +#define PSERIES_WDT_NUM_ALL ((unsigned long)-1) |
| + |
| +/* |
| * H_WATCHDOG Output |
| * |
| * R3: Return code |
| --- a/arch/powerpc/platforms/pseries/setup.c |
| +++ b/arch/powerpc/platforms/pseries/setup.c |
| @@ -76,6 +76,7 @@ |
| #include <asm/dtl.h> |
| #include <asm/hvconsole.h> |
| #include <asm/setup.h> |
| +#include <asm/papr-watchdog.h> |
| |
| #include "pseries.h" |
| |
| @@ -187,6 +188,16 @@ static void __init fwnmi_init(void) |
| #endif |
| } |
| |
| +static void pseries_crash_stop_watchdogs(void) |
| +{ |
| + long rc; |
| + |
| + rc = plpar_hcall_norets_notrace(H_WATCHDOG, PSERIES_WDTF_OP_STOP, |
| + PSERIES_WDT_NUM_ALL); |
| + if (rc != H_SUCCESS && rc != H_NOOP) |
| + pr_warn("Could not stop watchdogs before kdump rc=%ld\n", rc); |
| +} |
| + |
| /* |
| * Affix a device for the first timer to the platform bus if |
| * we have firmware support for the H_WATCHDOG hypercall. |
| @@ -205,6 +216,9 @@ static __init int pseries_wdt_init(void) |
| return PTR_ERR(pdev); |
| } |
| |
| + if (crash_shutdown_register(pseries_crash_stop_watchdogs)) |
| + pr_warn("Could not register watchdog crash shutdown handler\n"); |
| + |
| return 0; |
| } |
| machine_subsys_initcall(pseries, pseries_wdt_init); |