From nobody Sat Jul 25 03:20:17 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 1D65317BB21 for ; Sun, 19 Jul 2026 21:13:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784495605; cv=none; b=pR3H/IVpxy38KAu48YXqLUu4JnSJkFw8YK6XGpx3h3DHiGNbGMWQNLu0OFr41/0NhNF3Zav1ygEbZUYOWNK7KAZNHA2TGrmjMDjHQunCAbD3ce19nOyb5pvi9PMatMbUeWtSoRqbtHl9DFWAHsjUD2NdGpFwTHQY+WrHc8jCMF4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784495605; c=relaxed/simple; bh=xB9i/dO3WyjAhHsqQ6yXzdKWe8poByHZyA7mlpwBkvQ=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=JJRtlrk5pNQlFQYX7UlBKx3nCBTT47e17/xb1mFomFUoF18nzmgNKWS/BD7FDSRJladsWqqq399zyU4ubaWbumEH5yRK30o2ckCx9aoS+HdTxBmnAMIEeeLurMAUxypypw9l38nJvCBtklFQUyzdbYGZBqAD2R/sbWyGt6wyb2c= 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=YKkUjOBF; arc=none smtp.client-ip=209.85.214.173 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="YKkUjOBF" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2cc97653887so104267395ad.1 for ; Sun, 19 Jul 2026 14:13:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784495603; x=1785100403; 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:content-type; bh=CDAfciyZ/pwo0fbmhhGM+NACzss/tT17iLwZvqyayw0=; b=YKkUjOBFnujqX/U0RLKfdqmU986iDUOsm7wtpxnObZcze4WK/yP5fP2e30usyKT4pU lPzA4q6lXCxT40OzX/r2j0vccn3yjhE33D741nqzoikWrw6arS2tqbN/udlSm7ddl8uK wOi5QtoI3iClE1ZaObHL366KZFnVOP2Na7Sfq0rSlKYsVvTwvBUoISE3fb44DKNnxodC GRut3mQ13QO8N9oWqczg1PCUV2mvChmZJut5MApGPXVi6AoYVC1z0BXkLIN8c4Tume4/ x7WzYS08FtaqsjwevltxGCXRvclzKCB30PishG4/R328RPs7ojlG50d/OiNHWLC3u1pM Y8WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784495603; x=1785100403; 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:content-type; bh=CDAfciyZ/pwo0fbmhhGM+NACzss/tT17iLwZvqyayw0=; b=copDXSUYhLRO897lyqcYSNItBb+akebVDf3pGHSsboQJzGSb2hRw1Azjb3EEXzbZ2U M+x0AQHIiEB9kOQefJc8w2l1pkAMlDxnMxRqywXObXy0xXmQzEwu1IKpmPInzvU10TZQ I94ChcfBPQZQlphkMxw5QlCQjEsT9LB/H/EHN8P1CCK71jDnh06OiIkmZuKiPZT9cmSB zI2l7D33Fc2HbteYt5iYEdZhzR0VyAPmhDxGHR6n0c4b4mr0ZRkd6VAQmmViGVfwZlOm WzZ3vgJeUx+UmQqPUggtBjvdP4rPv31ejXMUisojPXSoH/iY3Mnp2fG8OLoA2PAP4n0D ED7w== X-Forwarded-Encrypted: i=1; AHgh+RrzK28fHr/v6UwlaQ72DXjyrERHCu3GELIPT/R5TD+fHXXjMEuhDoOg79MVpOkQgOo9gKbZaqpkI0+SNRw=@vger.kernel.org X-Gm-Message-State: AOJu0YyT+l+p4dHGwqrkUCiSrCSLelC1M56bGB1xPpW5e0pu4JIv9pqW T97PTmtEpgRkQ2r7TXqwmrfD9o/MROMI0Us+ri1eGBn9wdnhDb79V+/M X-Gm-Gg: AfdE7clZEOPY+xRbKXUhf/76iCFh300z4D9718iA5yuhe+ouQToYvZZb1wykdBSelkC aQo/jqUUi9HRG6r0RIBehosscbaN6cuYniqZLK5PtV+VzqmppBs0bGi4831I/bRn4cnehfTAk15 zx3SOEH+y21t7gnmL/w7Lsv3b2dM68/avZnuPCWiMznJqUKy8Cg48dZicCDI4qEl/RvBvZtJ0c+ OmBYSTeIwKlCctbOlx/prxP0Za3JM3n5f+CxuZLzH7mPlyLouM1EW6TjqCiicURk4zLbGCA5ut4 WK9ns162fZ9FxmmTl5rpGpBzW3pdeBWEN1ocKLhiFDU92V8UItgCOVZA593PfgO6L6VftTsc8ZY lwcmZOZtM+MN02fq91yufY3d1KQgzX42RvjjyYbVQnKO5v1yELFVpx4BMahzHEsUNJXSA4Zpwq8 S9cl2bL90cIvzoCNGBT0NewzoCHwBAuhtmxUATRyIRgnjRq/fh+z+LVRdAWfJjmBzXhZYtBb37N VaTivL16ib5V3Gfm+1GIYZzaHbzObIzCG9QToD01Zwxi4YcCSyyxwtXsEYmbXb1OQ== X-Received: by 2002:a17:902:e805:b0:2c9:d277:2cdd with SMTP id d9443c01a7336-2cf34887c56mr126301735ad.13.1784495603367; Sun, 19 Jul 2026 14:13:23 -0700 (PDT) Received: from ryzen.lan ([2601:644:8000:7a86::e35]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf34729df7sm45566775ad.63.2026.07.19.14.13.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 14:13:22 -0700 (PDT) From: Rosen Penev To: linux-edac@vger.kernel.org Cc: Andre Przywara , Borislav Petkov , Tony Luck , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , linux-kernel@vger.kernel.org (open list), llvm@lists.linux.dev (open list:CLANG/LLVM BUILD SUPPORT:Keyword:\b(?i:clang|llvm)\b) Subject: [PATCH] EDAC/highbank: manage mci lifetime via devres and simplify ioremap Date: Sun, 19 Jul 2026 14:13:21 -0700 Message-ID: <20260719211321.592800-1-rosenp@gmail.com> X-Mailer: git-send-email 2.55.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" Replace the open-coded platform_get_resource() + devm_request_mem_region() + devm_ioremap() sequence with the single helper devm_platform_ioremap_resource(), and move platform_get_irq() earlier, dropping the redundant -ENODEV/-EBUSY/-ENOMEM error paths. highbank_mc_probe() requests its interrupt with devm_request_irq(), passing mci as the handler context, but highbank_mc_remove() frees mci via edac_mc_free() before devres releases the IRQ, leaving a use-after-free window in the shared interrupt handler. Register an edac_mc_free() callback via devm_add_action_or_reset() right after edac_mc_alloc() so mci is owned by devres and freed only after the IRQ is released. Drop the explicit edac_mc_free() from both the probe error path and highbank_mc_remove(), and remove the now-redundant devres group open/close/release calls. Built for arm (CONFIG_EDAC_HIGHBANK) with LLVM=3D1; drivers/edac/highbank_mc_edac.o compiles cleanly and passes checkpatch --strict. Assisted-by: opencode:hy3-free Signed-off-by: Rosen Penev --- drivers/edac/highbank_mc_edac.c | 65 ++++++++++++--------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/drivers/edac/highbank_mc_edac.c b/drivers/edac/highbank_mc_eda= c.c index 3448ab750e9c..aeb326434cb3 100644 --- a/drivers/edac/highbank_mc_edac.c +++ b/drivers/edac/highbank_mc_edac.c @@ -142,6 +142,13 @@ static const struct of_device_id hb_ddr_ctrl_of_match[= ] =3D { }; MODULE_DEVICE_TABLE(of, hb_ddr_ctrl_of_match); =20 +static void highbank_mc_edac_free(void *data) +{ + struct mem_ctl_info *mci =3D data; + + edac_mc_free(mci); +} + static int highbank_mc_probe(struct platform_device *pdev) { const struct of_device_id *id; @@ -150,16 +157,23 @@ static int highbank_mc_probe(struct platform_device *= pdev) struct mem_ctl_info *mci; struct hb_mc_drvdata *drvdata; struct dimm_info *dimm; - struct resource *r; void __iomem *base; u32 control; int irq; - int res =3D 0; + int res; =20 id =3D of_match_device(hb_ddr_ctrl_of_match, &pdev->dev); if (!id) return -ENODEV; =20 + irq =3D platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + layers[0].type =3D EDAC_MC_LAYER_CHIP_SELECT; layers[0].size =3D 1; layers[0].is_virt_csrow =3D true; @@ -171,36 +185,13 @@ static int highbank_mc_probe(struct platform_device *= pdev) if (!mci) return -ENOMEM; =20 + if (devm_add_action_or_reset(&pdev->dev, highbank_mc_edac_free, mci)) + return -ENOMEM; + mci->pdev =3D &pdev->dev; drvdata =3D mci->pvt_info; platform_set_drvdata(pdev, mci); =20 - if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) { - res =3D -ENOMEM; - goto free; - } - - r =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!r) { - dev_err(&pdev->dev, "Unable to get mem resource\n"); - res =3D -ENODEV; - goto err; - } - - if (!devm_request_mem_region(&pdev->dev, r->start, - resource_size(r), dev_name(&pdev->dev))) { - dev_err(&pdev->dev, "Error while requesting mem region\n"); - res =3D -EBUSY; - goto err; - } - - base =3D devm_ioremap(&pdev->dev, r->start, resource_size(r)); - if (!base) { - dev_err(&pdev->dev, "Unable to map regs\n"); - res =3D -ENOMEM; - goto err; - } - settings =3D of_device_get_match_data(&pdev->dev); drvdata->mc_err_base =3D base + settings->err_offset; drvdata->mc_int_base =3D base + settings->int_offset; @@ -208,8 +199,7 @@ static int highbank_mc_probe(struct platform_device *pd= ev) control =3D readl(drvdata->mc_err_base + HB_DDR_ECC_OPT) & 0x3; if (!control || (control =3D=3D 0x2)) { dev_err(&pdev->dev, "No ECC present, or ECC disabled\n"); - res =3D -ENODEV; - goto err; + return -ENODEV; } =20 mci->mtype_cap =3D MEM_FLAG_DDR3; @@ -230,33 +220,24 @@ static int highbank_mc_probe(struct platform_device *= pdev) =20 res =3D edac_mc_add_mc_with_groups(mci, highbank_dev_groups); if (res < 0) - goto err; + return res; =20 - irq =3D platform_get_irq(pdev, 0); res =3D devm_request_irq(&pdev->dev, irq, highbank_mc_err_handler, 0, dev_name(&pdev->dev), mci); if (res < 0) { dev_err(&pdev->dev, "Unable to request irq %d\n", irq); - goto err2; + goto err; } =20 - devres_close_group(&pdev->dev, NULL); return 0; -err2: - edac_mc_del_mc(&pdev->dev); err: - devres_release_group(&pdev->dev, NULL); -free: - edac_mc_free(mci); + edac_mc_del_mc(&pdev->dev); return res; } =20 static void highbank_mc_remove(struct platform_device *pdev) { - struct mem_ctl_info *mci =3D platform_get_drvdata(pdev); - edac_mc_del_mc(&pdev->dev); - edac_mc_free(mci); } =20 static struct platform_driver highbank_mc_edac_driver =3D { --=20 2.55.0