From nobody Sun Jun 14 20:21:59 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E8F93101BC for ; Mon, 6 Apr 2026 06:16:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775456185; cv=none; b=SGzmKF1tQKUUCGL1VxmzMI+HKa4+DKt6IXMlMrX/XOgKhXeE1U3HuHI+S+57AjccXoqwujOJYsw0JEUKeeZ7/6YHcx1W4hVA/D/jzWI/UfSFa4W1chaW0BIS26UcEeeh5Ec63P0czZ7R06WABj0pr2yW/CrTKulz3C0ontuM20U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775456185; c=relaxed/simple; bh=nlljD1bpOVFeVndmlC4LiL68rwD11lfCqejCGlAnBfk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=DdvKWuOcaIV+2tIFZZakgpXF7DuBoj2B51GkBj9ycqtBlga7VN255IyCrI+cJjMS92pwh8tPPLc5vcyZ2+dES2HHYeHKoyCfZtEkn1xyytqo0SY52iS0L+iG4Ta9lJtTwrFak7EgLzJZ4DjfF2keU18T693lG1rKPTfEIorQxuM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PMDiYYmT; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PMDiYYmT" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-48558d6ef83so36621435e9.3 for ; Sun, 05 Apr 2026 23:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775456182; x=1776060982; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=iazOb18zH09zHtasIHRjBS4gdZV9mNmxJwOYyWl7kAo=; b=PMDiYYmTuFdY78GyeX+ufnLIb3zZfR9+494IQLQW0PwZ1uOY4hzbV+aSjFAmTFtmdw Bo+LKw86pFCGjiYNFjWwW9iI6pz/8nhN34fNGqfyOJ21/epbN4PGTrB7++/e+034G/co OEaopcuar1czHMkIvUSThpKF4YwT9iC/WyAtUvfL9WDbLWM24b5uDTcWqQMERgi9+gqO r48PH5V24cJCD61hGfeiOo0gJUCNXlwONieg5i6LFtLXRxiFbKWYvR8hV4LBnqOKVfBq OTVKypzMB2+rABRlfUalxwLATv6uKwjxD9Lt92+OM+iYGq/Ba8uQF+8+jODgakwJfmhw qcPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775456182; x=1776060982; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=iazOb18zH09zHtasIHRjBS4gdZV9mNmxJwOYyWl7kAo=; b=SIe9WcDNIlUZh/dt+8rL7IdVJeOGmlETpQC0vFNV6ClN/IFCSMF/8W1HisMe3K4b1w pWniuOq2ckCF7sWjIimdQQn3VrHMJciNxJfxYLRxQhAChcwDOJFFREqLJvqOQ27zhBig z7MPEWO3kr9YNYNzPcYhpQNsH9KLJodPLyrSEXI/kiCmNVMPi7HYDnO8yVG8F66Qgq6c Kw63M06rmqhzP0zErk8fyLSSslNCmyD/7QXAKjjW3h3kg+lom8+io0nHaemp+6/9vB8M i8GaHkOTAGx/OZ+oDjXASeDbmWsy+uHhgN8bR5ZO7R/RJQpQn7rLniULBWRfXt09GGQQ FmbQ== X-Forwarded-Encrypted: i=1; AJvYcCUyaRvWHvGBLMLbHnYnky1QB+08/w2iWve8rYnCA1nNllvFr/cTyl0mgMOtgpkwIz5tejJ/d8CSrimrUWU=@vger.kernel.org X-Gm-Message-State: AOJu0YwAJg3zCxB+VVuGhTsusvtB4GuIO/AyAbHRAmSk1zE1TC87gvuh MAZNLUY5v+0LGriOPU9YjEpWOGEBvCBH3I/9SD+XohAdCjlTOrEce4wK X-Gm-Gg: AeBDievo7sSPAftL3NaF/FdlH+l4xxl7kd0bbEI5m+PFHifZg12T8YiiSHv9yp9FFjM urDyvc0QIx1VGv/oEwz/cvkx9PTbMV5Zi2gmRFwGB2QxfKK7WqvbFFlES6sQXEAKWkClroEtM/c L2n6jrs9OZRuq+6t7Ogre6v/gFJeIXYtYAJeCAIULC4FhlFTS741RNIyvIAsiYoqU5VMrGgwKWj PTHHKRnkcgkEcXRZA3JBd+8/QNwkhAy+12WCMoeD8/FCORwLsLfxK/v4j6RFCX3f6K/Elhptfyr vF2vsuvNUlOdHLmg80tRscD0Bh9h4GyJphZORhrIF+SR+srKGe6LPCEjUSMv9JCEz72k76shpnI E3X9yxbyYVpkRsMx6WEJkrZNtbW2hLSX+93UPBJQe0D1yGb5SRTgIVthyF4RTgrmlFKNPrKzIUI Z7m3w/xYEOfTtYJ5a1DHvUwIrLNAhuzggWqTOvf+mchc828fDvhpjJUzLmcM3CSTTyj69XzEJWF 7k+lb/um7lXkn4vfSREmg0HDs6k2cic6EjSVw== X-Received: by 2002:a05:600d:8449:b0:487:1fbf:e0a1 with SMTP id 5b1f17b1804b1-488996a1e01mr127552785e9.4.1775456182266; Sun, 05 Apr 2026 23:16:22 -0700 (PDT) Received: from fedora.homenet.telecomitalia.it (host-82-53-109-192.retail.telecomitalia.it. [82.53.109.192]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488b6ff70bcsm26037455e9.14.2026.04.05.23.16.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Apr 2026 23:16:21 -0700 (PDT) From: Adriano Vero To: maddy@linux.ibm.com, mpe@ellerman.id.au Cc: npiggin@gmail.com, chleroy@kernel.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, Adriano Vero Subject: [PATCH] powerpc/fadump: Add timeout to RTAS busy-wait loops Date: Mon, 6 Apr 2026 08:15:42 +0200 Message-ID: <20260406061542.22354-1-litaliano00.contact@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- 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/pl= atforms/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) =20 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 =3D -EIO; =20 /* @@ -192,15 +192,20 @@ static int rtas_fadump_register(struct fw_dump *fadum= p_conf) fdm_size =3D sizeof(struct rtas_fadump_section_header); fdm_size +=3D be16_to_cpu(fdm.header.dump_num_sections) * sizeof(struct r= tas_fadump_section); =20 - /* TODO: Add upper time limit for the delay */ + total_wait =3D 0; do { rc =3D rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, NULL, FADUMP_REGISTER, &fdm, fdm_size); =20 wait_time =3D rtas_busy_delay_time(rc); - if (wait_time) + if (wait_time) { + if (total_wait >=3D RTAS_FADUMP_MAX_WAIT_MS) { + pr_err("Timed out waiting for firmware to register fadump\n"); + return -ETIMEDOUT; + } + total_wait +=3D wait_time; mdelay(wait_time); - + } } while (wait_time); =20 switch (rc) { @@ -234,18 +239,24 @@ static int rtas_fadump_register(struct fw_dump *fadum= p_conf) =20 static int rtas_fadump_unregister(struct fw_dump *fadump_conf) { - unsigned int wait_time; + unsigned int wait_time, total_wait; int rc; =20 - /* TODO: Add upper time limit for the delay */ + total_wait =3D 0; do { rc =3D rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, NULL, FADUMP_UNREGISTER, &fdm, sizeof(struct rtas_fadump_mem_struct)); =20 wait_time =3D rtas_busy_delay_time(rc); - if (wait_time) + if (wait_time) { + if (total_wait >=3D RTAS_FADUMP_MAX_WAIT_MS) { + pr_err("Timed out waiting for firmware to unregister fadump\n"); + return -ETIMEDOUT; + } + total_wait +=3D wait_time; mdelay(wait_time); + } } while (wait_time); =20 if (rc) { @@ -259,18 +270,24 @@ static int rtas_fadump_unregister(struct fw_dump *fad= ump_conf) =20 static int rtas_fadump_invalidate(struct fw_dump *fadump_conf) { - unsigned int wait_time; + unsigned int wait_time, total_wait; int rc; =20 - /* TODO: Add upper time limit for the delay */ + total_wait =3D 0; do { rc =3D rtas_call(fadump_conf->ibm_configure_kernel_dump, 3, 1, NULL, FADUMP_INVALIDATE, fdm_active, sizeof(struct rtas_fadump_mem_struct)); =20 wait_time =3D rtas_busy_delay_time(rc); - if (wait_time) + if (wait_time) { + if (total_wait >=3D RTAS_FADUMP_MAX_WAIT_MS) { + pr_err("Timed out waiting for firmware to invalidate fadump\n"); + return -ETIMEDOUT; + } + total_wait +=3D wait_time; mdelay(wait_time); + } } while (wait_time); =20 if (rc) { diff --git a/arch/powerpc/platforms/pseries/rtas-fadump.h b/arch/powerpc/pl= atforms/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 =20 +/* + * 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; --=20 2.53.0