* [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops
@ 2026-04-06 6:15 Adriano Vero
2026-04-07 4:06 ` Ritesh Harjani
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Adriano Vero @ 2026-04-06 6:15 UTC (permalink / raw)
To: maddy, mpe; +Cc: npiggin, chleroy, linuxppc-dev, linux-kernel, Adriano Vero
The ibm,configure-kernel-dump RTAS call sites in
rtas_fadump_register(), rtas_fadump_unregister(), and
rtas_fadump_invalidate() polled indefinitely while firmware returned
a busy status. A misbehaving or hung firmware could stall these paths
forever, blocking fadump registration at boot or preventing clean
teardown.
Track the accumulated delay in a total_wait counter and bail out with
-ETIMEDOUT if it reaches RTAS_FADUMP_MAX_WAIT_MS (60 seconds) before
firmware signals completion. This follows the bounded busy-wait pattern
used in rtas-rtc.c.
Signed-off-by: Adriano Vero <litaliano00.contact@gmail.com>
---
arch/powerpc/platforms/pseries/rtas-fadump.c | 37 ++++++++++++++------
arch/powerpc/platforms/pseries/rtas-fadump.h | 6 ++++
2 files changed, 33 insertions(+), 10 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.c b/arch/powerpc/platforms/pseries/rtas-fadump.c
index eceb32893..b165f165c 100644
--- a/arch/powerpc/platforms/pseries/rtas-fadump.c
+++ b/arch/powerpc/platforms/pseries/rtas-fadump.c
@@ -181,7 +181,7 @@ static u64 rtas_fadump_get_bootmem_min(void)
static int rtas_fadump_register(struct fw_dump *fadump_conf)
{
- unsigned int wait_time, fdm_size;
+ unsigned int wait_time, total_wait, fdm_size;
int rc, err = -EIO;
/*
@@ -192,15 +192,20 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf)
fdm_size = sizeof(struct rtas_fadump_section_header);
fdm_size += be16_to_cpu(fdm.header.dump_num_sections) * sizeof(struct rtas_fadump_section);
- /* TODO: Add upper time limit for the delay */
+ total_wait = 0;
do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_REGISTER, &fdm, fdm_size);
wait_time = rtas_busy_delay_time(rc);
- if (wait_time)
+ if (wait_time) {
+ if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) {
+ pr_err("Timed out waiting for firmware to register fadump\n");
+ return -ETIMEDOUT;
+ }
+ total_wait += wait_time;
mdelay(wait_time);
-
+ }
} while (wait_time);
switch (rc) {
@@ -234,18 +239,24 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf)
static int rtas_fadump_unregister(struct fw_dump *fadump_conf)
{
- unsigned int wait_time;
+ unsigned int wait_time, total_wait;
int rc;
- /* TODO: Add upper time limit for the delay */
+ total_wait = 0;
do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_UNREGISTER, &fdm,
sizeof(struct rtas_fadump_mem_struct));
wait_time = rtas_busy_delay_time(rc);
- if (wait_time)
+ if (wait_time) {
+ if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) {
+ pr_err("Timed out waiting for firmware to unregister fadump\n");
+ return -ETIMEDOUT;
+ }
+ total_wait += wait_time;
mdelay(wait_time);
+ }
} while (wait_time);
if (rc) {
@@ -259,18 +270,24 @@ static int rtas_fadump_unregister(struct fw_dump *fadump_conf)
static int rtas_fadump_invalidate(struct fw_dump *fadump_conf)
{
- unsigned int wait_time;
+ unsigned int wait_time, total_wait;
int rc;
- /* TODO: Add upper time limit for the delay */
+ total_wait = 0;
do {
rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1,
NULL, FADUMP_INVALIDATE, fdm_active,
sizeof(struct rtas_fadump_mem_struct));
wait_time = rtas_busy_delay_time(rc);
- if (wait_time)
+ if (wait_time) {
+ if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) {
+ pr_err("Timed out waiting for firmware to invalidate fadump\n");
+ return -ETIMEDOUT;
+ }
+ total_wait += wait_time;
mdelay(wait_time);
+ }
} while (wait_time);
if (rc) {
diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.h b/arch/powerpc/platforms/pseries/rtas-fadump.h
index c109abf6b..65fdab7b5 100644
--- a/arch/powerpc/platforms/pseries/rtas-fadump.h
+++ b/arch/powerpc/platforms/pseries/rtas-fadump.h
@@ -41,6 +41,12 @@
#define MAX_SECTIONS 10
#define RTAS_FADUMP_MAX_BOOT_MEM_REGS 7
+/*
+ * Maximum time to wait for firmware to respond to an
+ * ibm,configure-kernel-dump RTAS call before giving up.
+ */
+#define RTAS_FADUMP_MAX_WAIT_MS 60000U
+
/* Kernel Dump section info */
struct rtas_fadump_section {
__be32 request_flag;
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-06 6:15 [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops Adriano Vero @ 2026-04-07 4:06 ` Ritesh Harjani 2026-04-07 6:28 ` litaliano00 2026-04-13 13:50 ` Sourabh Jain 2026-04-19 6:50 ` [PATCH v2] " Adriano Vero 2 siblings, 1 reply; 7+ messages in thread From: Ritesh Harjani @ 2026-04-07 4:06 UTC (permalink / raw) To: Adriano Vero, maddy, mpe Cc: npiggin, chleroy, linuxppc-dev, linux-kernel, Adriano Vero Adriano Vero <litaliano00.contact@gmail.com> writes: > The ibm,configure-kernel-dump RTAS call sites in > rtas_fadump_register(), rtas_fadump_unregister(), and > rtas_fadump_invalidate() polled indefinitely while firmware returned > a busy status. A misbehaving or hung firmware could stall these paths > forever, blocking fadump registration at boot or preventing clean > teardown. Was there an issue which you encountered? Can you share the details of the same please? > > Track the accumulated delay in a total_wait counter and bail out with > -ETIMEDOUT if it reaches RTAS_FADUMP_MAX_WAIT_MS (60 seconds) before > firmware signals completion. This follows the bounded busy-wait pattern > used in rtas-rtc.c. > > Signed-off-by: Adriano Vero <litaliano00.contact@gmail.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-07 4:06 ` Ritesh Harjani @ 2026-04-07 6:28 ` litaliano00 0 siblings, 0 replies; 7+ messages in thread From: litaliano00 @ 2026-04-07 6:28 UTC (permalink / raw) To: Ritesh Harjani; +Cc: maddy, mpe, npiggin, chleroy, linuxppc-dev, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1834 bytes --] Hi Ritesh, No, I haven't encountered a specific hang on live hardware in production. This was a proactive fix that originated from an audit of the RTAS call sites. I noticed the explicit `/* TODO: Add upper time limit for the delay */` comments in rtas-fadump.c that had not yet been implemented. When cross-referencing this with other parts of the pSeries code (such as the bounded busy-wait pattern used in rtas-rtc.c), it seemed that adding a timeout is the standard defensive programming approach for these hypervisor calls. Since these fadump registration and teardown paths happen during critical boot and state transition phases, a misbehaving hypervisor or firmware anomaly could lead to a hard-to-debug, silent system stall. I implemented the 60-second timeout to resolve the pending TODOs and ensure the kernel remains resilient in those specific edge cases. Thanks, Adriano On Tue, Apr 7, 2026 at 6:07 AM Ritesh Harjani <ritesh.list@gmail.com> wrote: > Adriano Vero <litaliano00.contact@gmail.com> writes: > > > The ibm,configure-kernel-dump RTAS call sites in > > rtas_fadump_register(), rtas_fadump_unregister(), and > > rtas_fadump_invalidate() polled indefinitely while firmware returned > > a busy status. A misbehaving or hung firmware could stall these paths > > forever, blocking fadump registration at boot or preventing clean > > teardown. > > Was there an issue which you encountered? Can you share the details of > the same please? > > > > > > Track the accumulated delay in a total_wait counter and bail out with > > -ETIMEDOUT if it reaches RTAS_FADUMP_MAX_WAIT_MS (60 seconds) before > > firmware signals completion. This follows the bounded busy-wait pattern > > used in rtas-rtc.c. > > > > Signed-off-by: Adriano Vero <litaliano00.contact@gmail.com> > [-- Attachment #2: Type: text/html, Size: 2390 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-06 6:15 [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops Adriano Vero 2026-04-07 4:06 ` Ritesh Harjani @ 2026-04-13 13:50 ` Sourabh Jain 2026-04-13 21:37 ` litaliano00 2026-04-19 6:50 ` [PATCH v2] " Adriano Vero 2 siblings, 1 reply; 7+ messages in thread From: Sourabh Jain @ 2026-04-13 13:50 UTC (permalink / raw) To: Adriano Vero, maddy, mpe; +Cc: npiggin, chleroy, linuxppc-dev, linux-kernel Hello Adriano On 06/04/26 11:45, Adriano Vero wrote: > The ibm,configure-kernel-dump RTAS call sites in > rtas_fadump_register(), rtas_fadump_unregister(), and > rtas_fadump_invalidate() polled indefinitely while firmware returned > a busy status. A misbehaving or hung firmware could stall these paths > forever, blocking fadump registration at boot or preventing clean > teardown. I agree that it is a good idea to avoid calling rtas_call for fadump operations indefinitely. However, so far I have not come across a case where the kernel gets stuck during fadump registration, unregistration, or invalidation due to phyp/RTAS continuously returning a wait time on an LPAR. That said, since fadump support has recently been extended to QEMU, this change might possibly prove useful in that environment. > > Track the accumulated delay in a total_wait counter and bail out with > -ETIMEDOUT if it reaches RTAS_FADUMP_MAX_WAIT_MS (60 seconds) What is the rationale behind choosing a 60-second limit? > before > firmware signals completion. This follows the bounded busy-wait pattern > used in rtas-rtc.c. > > Signed-off-by: Adriano Vero <litaliano00.contact@gmail.com> > --- > arch/powerpc/platforms/pseries/rtas-fadump.c | 37 ++++++++++++++------ > arch/powerpc/platforms/pseries/rtas-fadump.h | 6 ++++ > 2 files changed, 33 insertions(+), 10 deletions(-) > > diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.c b/arch/powerpc/platforms/pseries/rtas-fadump.c > index eceb32893..b165f165c 100644 > --- a/arch/powerpc/platforms/pseries/rtas-fadump.c > +++ b/arch/powerpc/platforms/pseries/rtas-fadump.c > @@ -181,7 +181,7 @@ static u64 rtas_fadump_get_bootmem_min(void) > > static int rtas_fadump_register(struct fw_dump *fadump_conf) > { > - unsigned int wait_time, fdm_size; > + unsigned int wait_time, total_wait, fdm_size; > int rc, err = -EIO; > > /* > @@ -192,15 +192,20 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf) > fdm_size = sizeof(struct rtas_fadump_section_header); > fdm_size += be16_to_cpu(fdm.header.dump_num_sections) * sizeof(struct rtas_fadump_section); > > - /* TODO: Add upper time limit for the delay */ > + total_wait = 0; > do { > rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, > NULL, FADUMP_REGISTER, &fdm, fdm_size); > > wait_time = rtas_busy_delay_time(rc); > - if (wait_time) > + if (wait_time) { > + if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) { > + pr_err("Timed out waiting for firmware to register fadump\n"); > + return -ETIMEDOUT; > + } > + total_wait += wait_time; > mdelay(wait_time); > - > + } > } while (wait_time); > > switch (rc) { > @@ -234,18 +239,24 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf) > > static int rtas_fadump_unregister(struct fw_dump *fadump_conf) > { > - unsigned int wait_time; > + unsigned int wait_time, total_wait; > int rc; > > - /* TODO: Add upper time limit for the delay */ > + total_wait = 0; > do { > rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, > NULL, FADUMP_UNREGISTER, &fdm, > sizeof(struct rtas_fadump_mem_struct)); > > wait_time = rtas_busy_delay_time(rc); > - if (wait_time) > + if (wait_time) { > + if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) { > + pr_err("Timed out waiting for firmware to unregister fadump\n"); > + return -ETIMEDOUT; > + } > + total_wait += wait_time; > mdelay(wait_time); > + } > } while (wait_time); > > if (rc) { > @@ -259,18 +270,24 @@ static int rtas_fadump_unregister(struct fw_dump *fadump_conf) > > static int rtas_fadump_invalidate(struct fw_dump *fadump_conf) > { > - unsigned int wait_time; > + unsigned int wait_time, total_wait; > int rc; > > - /* TODO: Add upper time limit for the delay */ > + total_wait = 0; > do { > rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, > NULL, FADUMP_INVALIDATE, fdm_active, > sizeof(struct rtas_fadump_mem_struct)); > > wait_time = rtas_busy_delay_time(rc); > - if (wait_time) > + if (wait_time) { > + if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) { > + pr_err("Timed out waiting for firmware to invalidate fadump\n"); > + return -ETIMEDOUT; > + } > + total_wait += wait_time; > mdelay(wait_time); > + } > } while (wait_time); This do...while loop is almost identical in all three places. Would it make sense to introduce a helper function to wrap the rtas_call, along with handling the wait time and timeout? - Sourabh Jain > if (rc) { > diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.h b/arch/powerpc/platforms/pseries/rtas-fadump.h > index c109abf6b..65fdab7b5 100644 > --- a/arch/powerpc/platforms/pseries/rtas-fadump.h > +++ b/arch/powerpc/platforms/pseries/rtas-fadump.h > @@ -41,6 +41,12 @@ > #define MAX_SECTIONS 10 > #define RTAS_FADUMP_MAX_BOOT_MEM_REGS 7 > > +/* > + * Maximum time to wait for firmware to respond to an > + * ibm,configure-kernel-dump RTAS call before giving up. > + */ > +#define RTAS_FADUMP_MAX_WAIT_MS 60000U > + > /* Kernel Dump section info */ > struct rtas_fadump_section { > __be32 request_flag; ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-13 13:50 ` Sourabh Jain @ 2026-04-13 21:37 ` litaliano00 2026-04-14 10:29 ` Sourabh Jain 0 siblings, 1 reply; 7+ messages in thread From: litaliano00 @ 2026-04-13 21:37 UTC (permalink / raw) To: Sourabh Jain; +Cc: maddy, mpe, npiggin, chleroy, linuxppc-dev, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1025 bytes --] On Mon, Apr 13, 2026, 15:50 Sourabh Jain <sourabhjain@linux.ibm.com> wrote: > > What is the rationale behind choosing a 60-second limit? > The 60-second value was chosen somewhat arbitrarily. Looking at rtas_busy_delay_time(), the maximum single delay returned is 100000ms (status 9905). In practice, legitimate busy delays are expected to be much shorter. I was following the spirit of rtas-rtc.c which uses a 5-second limit for simpler operations; fadump is a heavier firmware operation, so I went higher. I am open to suggestions on a more principled value. > > Would it make sense to introduce a helper function to wrap the > rtas_call, along with handling the wait time and timeout? > Absolutely, I will introduce a helper in v2. The three sites are indeed identical except for the FADUMP_REGISTER/UNREGISTER/INVALIDATE argument and the struct pointer/size. I will factor out the common busy-wait loop into a static helper. > Will send v2 shortly from my new email adri.vero.dev@gmail.com > Adriano [-- Attachment #2: Type: text/html, Size: 3699 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-13 21:37 ` litaliano00 @ 2026-04-14 10:29 ` Sourabh Jain 0 siblings, 0 replies; 7+ messages in thread From: Sourabh Jain @ 2026-04-14 10:29 UTC (permalink / raw) To: litaliano00; +Cc: maddy, mpe, npiggin, chleroy, linuxppc-dev, linux-kernel On 14/04/26 03:07, litaliano00 wrote: > On Mon, Apr 13, 2026, 15: 50 Sourabh Jain > <sourabhjain@ linux. ibm. com> wrote: > What is the rationale behind > choosing a 60-second limit? The 60-second value was chosen somewhat > arbitrarily. Looking at rtas_busy_delay_time(), the maximum > > On Mon, Apr 13, 2026, 15:50 Sourabh Jain <sourabhjain@linux.ibm.com> > wrote: > > > What is the rationale behind choosing a 60-second limit? > > > The 60-second value was chosen somewhat arbitrarily. Looking at > > rtas_busy_delay_time(), the maximum single delay returned is 100000ms > > (status 9905). In practice, legitimate busy delays are expected to be > > much shorter. I was following the spirit of rtas-rtc.c which uses a > > 5-second limit for simpler operations; fadump is a heavier firmware > > operation, so I went higher. I am open to suggestions on a more > > principled value. > phyp/RTAS is a black box to me, so it is hard to conclude what happens during fadump register/unregister/invalidate. However, based on QEMU's fadump implementation, all three operations do not seem very complex. That said, I am OK with a 60 sec timeout. I would also recommend adding pr_debug logs when the wait time is hit. It might help debug cases where the kernel reaches the 60 sec limit especially during boot. - Sourabh Jain > > > Would it make sense to introduce a helper function to wrap the > > > rtas_call, along with handling the wait time and timeout? > > > Absolutely, I will introduce a helper in v2. The three sites are > > indeed identical except for the FADUMP_REGISTER/UNREGISTER/INVALIDATE > > argument and the struct pointer/size. I will factor out the common > > busy-wait loop into a static helper. > > > Will send v2 shortly from my new email adri.vero.dev@gmail.com > > > Adriano > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] powerpc/fadump: Add timeout to RTAS busy-wait loops 2026-04-06 6:15 [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops Adriano Vero 2026-04-07 4:06 ` Ritesh Harjani 2026-04-13 13:50 ` Sourabh Jain @ 2026-04-19 6:50 ` Adriano Vero 2 siblings, 0 replies; 7+ messages in thread From: Adriano Vero @ 2026-04-19 6:50 UTC (permalink / raw) To: maddy, mpe, sourabhjain Cc: npiggin, chleroy, linuxppc-dev, linux-kernel, Adriano Vero The ibm,configure-kernel-dump RTAS call sites in rtas_fadump_register(), rtas_fadump_unregister(), and rtas_fadump_invalidate() polled indefinitely while firmware returned a busy status. A misbehaving or hung firmware could stall these paths forever, blocking fadump registration at boot or preventing clean teardown. Introduce rtas_fadump_call(), a helper that wraps the common busy-wait pattern shared by all three sites. The helper accumulates the total delay and returns -ETIMEDOUT if firmware keeps returning a busy status beyond RTAS_FADUMP_MAX_WAIT_MS (60 seconds). A pr_debug() message is emitted on each busy iteration to aid diagnosis when the timeout is hit. Signed-off-by: Adriano Vero <adri.vero.dev@gmail.com> --- arch/powerpc/platforms/pseries/rtas-fadump.c | 80 ++++++++++++-------- arch/powerpc/platforms/pseries/rtas-fadump.h | 6 ++ 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.c b/arch/powerpc/platforms/pseries/rtas-fadump.c index eceb32893..3bb4ac2ab 100644 --- a/arch/powerpc/platforms/pseries/rtas-fadump.c +++ b/arch/powerpc/platforms/pseries/rtas-fadump.c @@ -179,9 +179,42 @@ static u64 rtas_fadump_get_bootmem_min(void) return RTAS_FADUMP_MIN_BOOT_MEM; } +/* + * Helper to make an ibm,configure-kernel-dump RTAS call with a bounded + * busy-wait loop. Returns the RTAS return code on completion, or + * -ETIMEDOUT if firmware keeps returning a busy status beyond + * RTAS_FADUMP_MAX_WAIT_MS milliseconds. + */ +static int rtas_fadump_call(struct fw_dump *fadump_conf, int operation, + void *fdm_ptr, unsigned int fdm_size, + const char *op_name) +{ + unsigned int wait_time, total_wait = 0; + int rc; + + do { + rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, + NULL, operation, fdm_ptr, fdm_size); + wait_time = rtas_busy_delay_time(rc); + if (wait_time) { + pr_debug("Firmware busy during fadump %s, waiting %ums (total %ums)\n", + op_name, wait_time, total_wait); + if (total_wait >= RTAS_FADUMP_MAX_WAIT_MS) { + pr_err("Timed out waiting for firmware to complete fadump %s\n", + op_name); + return -ETIMEDOUT; + } + total_wait += wait_time; + mdelay(wait_time); + } + } while (wait_time); + + return rc; +} + static int rtas_fadump_register(struct fw_dump *fadump_conf) { - unsigned int wait_time, fdm_size; + unsigned int fdm_size; int rc, err = -EIO; /* @@ -192,16 +225,10 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf) fdm_size = sizeof(struct rtas_fadump_section_header); fdm_size += be16_to_cpu(fdm.header.dump_num_sections) * sizeof(struct rtas_fadump_section); - /* TODO: Add upper time limit for the delay */ - do { - rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, - NULL, FADUMP_REGISTER, &fdm, fdm_size); - - wait_time = rtas_busy_delay_time(rc); - if (wait_time) - mdelay(wait_time); - - } while (wait_time); + rc = rtas_fadump_call(fadump_conf, FADUMP_REGISTER, &fdm, fdm_size, + "register"); + if (rc == -ETIMEDOUT) + return -ETIMEDOUT; switch (rc) { case 0: @@ -234,19 +261,12 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf) static int rtas_fadump_unregister(struct fw_dump *fadump_conf) { - unsigned int wait_time; int rc; - /* TODO: Add upper time limit for the delay */ - do { - rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, - NULL, FADUMP_UNREGISTER, &fdm, - sizeof(struct rtas_fadump_mem_struct)); - - wait_time = rtas_busy_delay_time(rc); - if (wait_time) - mdelay(wait_time); - } while (wait_time); + rc = rtas_fadump_call(fadump_conf, FADUMP_UNREGISTER, &fdm, + sizeof(struct rtas_fadump_mem_struct), "unregister"); + if (rc == -ETIMEDOUT) + return -ETIMEDOUT; if (rc) { pr_err("Failed to un-register - unexpected error(%d).\n", rc); @@ -259,19 +279,13 @@ static int rtas_fadump_unregister(struct fw_dump *fadump_conf) static int rtas_fadump_invalidate(struct fw_dump *fadump_conf) { - unsigned int wait_time; int rc; - /* TODO: Add upper time limit for the delay */ - do { - rc = rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, - NULL, FADUMP_INVALIDATE, fdm_active, - sizeof(struct rtas_fadump_mem_struct)); - - wait_time = rtas_busy_delay_time(rc); - if (wait_time) - mdelay(wait_time); - } while (wait_time); + rc = rtas_fadump_call(fadump_conf, FADUMP_INVALIDATE, + (void *)fdm_active, + sizeof(struct rtas_fadump_mem_struct), "invalidate"); + if (rc == -ETIMEDOUT) + return -ETIMEDOUT; if (rc) { pr_err("Failed to invalidate - unexpected error (%d).\n", rc); diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.h b/arch/powerpc/platforms/pseries/rtas-fadump.h index c109abf6b..65fdab7b5 100644 --- a/arch/powerpc/platforms/pseries/rtas-fadump.h +++ b/arch/powerpc/platforms/pseries/rtas-fadump.h @@ -41,6 +41,12 @@ #define MAX_SECTIONS 10 #define RTAS_FADUMP_MAX_BOOT_MEM_REGS 7 +/* + * Maximum time to wait for firmware to respond to an + * ibm,configure-kernel-dump RTAS call before giving up. + */ +#define RTAS_FADUMP_MAX_WAIT_MS 60000U + /* Kernel Dump section info */ struct rtas_fadump_section { __be32 request_flag; -- 2.53.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-04-19 12:40 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-06 6:15 [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops Adriano Vero 2026-04-07 4:06 ` Ritesh Harjani 2026-04-07 6:28 ` litaliano00 2026-04-13 13:50 ` Sourabh Jain 2026-04-13 21:37 ` litaliano00 2026-04-14 10:29 ` Sourabh Jain 2026-04-19 6:50 ` [PATCH v2] " Adriano Vero
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox