From nobody Mon Sep 28 10:46:46 2026 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (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 7A0562594BD for ; Sun, 23 Aug 2026 07:11:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787469110; cv=none; b=GHbIV2KBpd2rcfRdbFukZcqj+i21E7DXOXMRljH9nkr9I5ud0hnb6Y662KhGM6wyab2wcXgpHbd20zvbTOHVs2WMit0fF1NwY81FuPcERWNdVs5uIdKesUYITBV9CXA2FjHOMvKcedVy6RB0/IcOh5Sj59RdcFGrWOMVPpgwO/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787469110; c=relaxed/simple; bh=5E1s7lUtKaiuCp8Wtr0jt8WzTyQeUUM0dkL2I3Jsxhk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PF+e4ky+mfioO4nRlPwK/YtkliwrOODS1HMfQeParonsPpT6vBeb3JVj0/v/Ev+wXn6pg0hU3Hzu/hxCFh28ATvXWKA758DE8/tfdaeffy60pVxdG3t2DciCYlvaI7Wb+MfCziOYbDh9m7zkVKRnsAIAZX8hWC/5QtDx+BPRhUw= 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=OC4C0PJY; arc=none smtp.client-ip=209.85.215.179 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="OC4C0PJY" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-cbe827e3cb4so2797552a12.3 for ; Sun, 23 Aug 2026 00:11:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787469109; x=1788073909; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PpvEmSfetcKu58vemKhIVNLIz2Kr8KQYzNtwaCQIwdM=; b=OC4C0PJYbQ7N9N0poC89tQSKGu44jFW2bLTSEIwMsp68sJ2UOt21xZHQtEZPHBGaLW YWKwetXdyOPoQuR8JrQxKgI97JdeEFdUnpGqSwN/YyhdLmwcPhiUus0yIxM62tznygQd DBCeY6PrKVOXNfVdUuySfwZqoSyUwWTud4XDCtdDS6mEkCWQmOcL5IEV7CKZyStiwwky at7M5R1sTp0JN5aqmmY7noJn4GvSICB3nigM2Kcj/rgDN3ZqATjespBFwsqiw3xnr4L7 /kHELfv4iINey474ufPQLjkgCMzr3PvWIawtjexzh2wXIJgIAHxq7r71TxoOMWuzAXBv zYrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787469109; x=1788073909; h=content-transfer-encoding:mime-version:references:in-reply-to :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=PpvEmSfetcKu58vemKhIVNLIz2Kr8KQYzNtwaCQIwdM=; b=Ns0TATn/wFU1tRjkP5lUKkeVA14jIC9FYxFtvG/Rp0941yiqhtBUqI9cFVpfPOG5+x 8wxXp0b3Ik0h096bcFI+O+NlygapaUW2jDRNdNzGReyVzYvRXf1VsP/IgVs3gY+maSk5 pXdFK8RvfVtWkBAwkqskGa/hXQlkb9VNfIdR8vp+1er9RpBEHy9/bgIJ8eLnPyFOvdGS VYj20JA8jpotvNMfj+693XeJ3kRCKTJPzKII+0dAHpqhAZbXOQwuUsH0XhQ0vjde/WCM lkyL6udk3+FXrtSIWFBwgGJVxIQj3JuEOyS/pwfAL8viFEhyzblTDYG0I9uQIzqZcuA3 IjwQ== X-Forwarded-Encrypted: i=1; AHgh+Rp4L3w6042IWeTkc3/1PXdjYh0dWKyGlQ7EcoJLCBjP+ufKVKqdpvl4tG+g5Cs1wQNmrbWvyF0MNaQtY3k=@vger.kernel.org X-Gm-Message-State: AFuF++nyxg4Z5KMpximGtEylr1bg/2Ubpx/jrjTdpFI7qHTI9Ca41cPo atJfbx4s5u8Cl6bBUibD9/bdhppsbLxmDVsFzZdhboKtJxpr2gU+XN61 X-Gm-Gg: AR+sD111QcSmrfePoB2d6UQH2sHi5BEj26F330iYmOiCrNSoMbvnPZRzFk4vrm8Toux XpGf3E3Q14NyKj2rmq3V1VPyC3/oZWu0bNoJBCZTQ76f6NcMd+UiLqUYPDENy/WX2sOW7FL+FhI 3BOG+exEF64wSyp+691bmvTjrfoRkz8ipYGmeJv07yPbOg1Et0FhXEWWnMwl38Lf9bJ7RupDHfK YQXggAV3VoEu9CMET5Cc4ktdLZZbF98mZyNhwLUCcvsRXrN+u72bAXRi66AiotlplKFBqEKY3f6 1wlOWHTMeNql+y9ww0bR2De2+g+6lBQD9OO6uYSBvHRm34c9C5bM5RZVm/D8bEpNsnLihxsHMle RX8r7MOFvMFjI4CUPOhqALzGufftBBYiHLxvtO15E5VWzB+iwC4ZIfymLEHadZLbAU1BiYF56Mb HY0ZxVtT0GNRBVCpPmJ5Jk1xGZGgtRs+CabqIaB3qKCoYPBT5DymSt6DNZvId1yNu6CJoYBsszu tOrgfHQ2aDEX6P0mHIHBHmfkvzSsG9XG9wpZ4xUIYZm7aILtQZb X-Received: by 2002:a05:6a00:a8c:b0:84e:d5e6:a085 with SMTP id d2e1a72fcca58-851f969b7a9mr28112156b3a.0.1787469108569; Sun, 23 Aug 2026 00:11:48 -0700 (PDT) Received: from hanzj-mi.. (ec2-99-79-140-187.ca-central-1.compute.amazonaws.com. [99.79.140.187]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-8520f149e77sm1034990b3a.42.2026.08.23.00.11.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Aug 2026 00:11:48 -0700 (PDT) From: hanzhijian To: Richard Zhu , Lucas Stach , Lorenzo Pieralisi , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Manivannan Sadhasivam , Bjorn Helgaas Cc: Rob Herring , Frank Li , Sascha Hauer , kernel@pengutronix.de, Fabio Estevam , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev, linux-kernel@vger.kernel.org, hanzhijian , sashiko-bot@kernel.org Subject: [PATCH v2] PCI: imx6: fix resource leaks in probe error paths Date: Sun, 23 Aug 2026 15:11:28 +0800 Message-ID: <20260823071129.2980059-1-hanzhijian1991@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260823011125.2876504-1-hanzhijian1991@gmail.com> References: <20260823011125.2876504-1-hanzhijian1991@gmail.com> 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" imx_pcie_probe() leaks both pwrctrl devices and power domains on failure: - imx_pcie_attach_pd() attaches the "pcie" and "pcie_phy" power domains and creates device links to them, but the device links are only kept in a local variable and nothing detaches the domains on probe failure or deferral, so all of them leak. - A failure of devm_pm_runtime_set_active_enabled() returns directly without destroying the pwrctrl devices. - A partial failure inside imx_pcie_attach_pd() leaks the power domains and device links that were already attached. Save the device links, add imx_pcie_detach_pd() to release the power domains and device links in reverse order of acquisition, call it from the probe error paths, and make imx_pcie_attach_pd() release everything it has attached so far on failure. Reported-by: sashiko-bot@kernel.org Link: https://lore.kernel.org/all/20260822013640.182C01F000E9@smtp.kernel.o= rg/ Signed-off-by: hanzhijian --- drivers/pci/controller/dwc/pci-imx6.c | 42 ++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller= /dwc/pci-imx6.c index 39790e66b..a2bae4a2c 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c @@ -182,6 +182,9 @@ struct imx_pcie { struct device *pd_pcie; /* power domain for pcie phy */ struct device *pd_pcie_phy; + /* device links for the power domains */ + struct device_link *pd_link; + struct device_link *pd_phy_link; struct phy *phy; const struct imx_pcie_drvdata *drvdata; =20 @@ -639,6 +642,26 @@ static int imx6q_pcie_abort_handler(unsigned long addr, } #endif =20 +static void imx_pcie_detach_pd(struct imx_pcie *imx_pcie) +{ + if (imx_pcie->pd_phy_link) { + device_link_del(imx_pcie->pd_phy_link); + imx_pcie->pd_phy_link =3D NULL; + } + if (!IS_ERR_OR_NULL(imx_pcie->pd_pcie_phy)) { + dev_pm_domain_detach(imx_pcie->pd_pcie_phy, true); + imx_pcie->pd_pcie_phy =3D NULL; + } + if (imx_pcie->pd_link) { + device_link_del(imx_pcie->pd_link); + imx_pcie->pd_link =3D NULL; + } + if (!IS_ERR_OR_NULL(imx_pcie->pd_pcie)) { + dev_pm_domain_detach(imx_pcie->pd_pcie, true); + imx_pcie->pd_pcie =3D NULL; + } +} + static int imx_pcie_attach_pd(struct device *dev) { struct imx_pcie *imx_pcie =3D dev_get_drvdata(dev); @@ -660,12 +683,18 @@ static int imx_pcie_attach_pd(struct device *dev) DL_FLAG_RPM_ACTIVE); if (!link) { dev_err(dev, "Failed to add device_link to pcie pd\n"); + imx_pcie_detach_pd(imx_pcie); return -EINVAL; } + imx_pcie->pd_link =3D link; =20 imx_pcie->pd_pcie_phy =3D dev_pm_domain_attach_by_name(dev, "pcie_phy"); - if (IS_ERR(imx_pcie->pd_pcie_phy)) - return PTR_ERR(imx_pcie->pd_pcie_phy); + if (IS_ERR(imx_pcie->pd_pcie_phy)) { + int ret =3D PTR_ERR(imx_pcie->pd_pcie_phy); + + imx_pcie_detach_pd(imx_pcie); + return ret; + } =20 link =3D device_link_add(dev, imx_pcie->pd_pcie_phy, DL_FLAG_STATELESS | @@ -673,8 +702,10 @@ static int imx_pcie_attach_pd(struct device *dev) DL_FLAG_RPM_ACTIVE); if (!link) { dev_err(dev, "Failed to add device_link to pcie_phy pd\n"); + imx_pcie_detach_pd(imx_pcie); return -EINVAL; } + imx_pcie->pd_phy_link =3D link; =20 return 0; } @@ -1956,8 +1987,10 @@ static int imx_pcie_probe(struct platform_device *pd= ev) return ret; =20 ret =3D pci_pwrctrl_create_devices(dev); - if (ret) + if (ret) { + imx_pcie_detach_pd(imx_pcie); return dev_err_probe(dev, ret, "failed to create pwrctrl devices\n"); + } =20 pci->use_parent_dt_ranges =3D true; if (imx_pcie->drvdata->mode =3D=3D DW_PCIE_EP_TYPE) { @@ -1975,7 +2008,7 @@ static int imx_pcie_probe(struct platform_device *pde= v) pm_runtime_no_callbacks(dev); ret =3D devm_pm_runtime_set_active_enabled(dev); if (ret < 0) - return ret; + goto err_pwrctrl_destroy; } =20 if (imx_check_flag(imx_pcie, IMX_PCIE_FLAG_SKIP_L23_READY)) @@ -1999,6 +2032,7 @@ static int imx_pcie_probe(struct platform_device *pde= v) return 0; =20 err_pwrctrl_destroy: + imx_pcie_detach_pd(imx_pcie); if (ret !=3D -EPROBE_DEFER) pci_pwrctrl_destroy_devices(dev); return ret; --=20 2.43.0