* [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns
@ 2025-09-21 16:14 Alok Tiwari
2025-09-21 17:19 ` Marc Zyngier
2025-09-22 10:55 ` AngeloGioacchino Del Regno
0 siblings, 2 replies; 3+ messages in thread
From: Alok Tiwari @ 2025-09-21 16:14 UTC (permalink / raw)
To: thomas.petazzoni, pali, lpieralisi, kwilczynski, mani, robh,
bhelgaas, joyce.ooi, alyssa, maz, jim2101024, florian.fainelli,
bcm-kernel-feedback-list, rjui, sbranden, ryder.lee, jianjun.wang,
sergio.paracuellos, matthias.bgg, angelogioacchino.delregno,
marek.vasut+renesas, yoshihiro.shimoda.uh, geert+renesas,
magnus.damm, shawn.lin, heiko, michal.simek, bharat.kumar.gogada,
will, kys, haiyangz, wei.liu, decui, linus.walleij,
thierry.reding, jonathanh, rric, nirmal.patel, toan,
jonathan.derrick, linux-pci
Cc: alok.a.tiwari, linux-arm-kernel, linux-kernel, linux-rpi-kernel,
linux-mediatek, linux-renesas-soc, linux-rockchip, linux-hyperv,
linux-tegra
devm_pci_alloc_host_bridge() and pci_alloc_host_bridge() previously
returned NULL on failure, forcing callers to special-case NULL handling
and often hardcode -ENOMEM as the error.
This series updates devm_pci_alloc_host_bridge() to consistently return
error pointers (ERR_PTR) with the actual error code, instead of NULL.
All callers across PCI host controller drivers are updated to use
IS_ERR_OR_NULL()/PTR_ERR() instead of NULL checks and hardcoded -ENOMEM.
Benefits:
- Standardizes error handling with Linux kernel ERR_PTR()/PTR_ERR()
conventions.
- Ensures that the actual error code from lower-level helpers is
propagated back to the caller.
- Removes ambiguity between NULL and error pointer returns.
Touched drivers include:
cadence (J721E, cadence-plat)
dwc (designware, qcom)
mobiveil (layerscape-gen4, mobiveil-plat)
aardvark, ftpci100, ixp4xx, loongson, mvebu, rcar, tegra, v3-semi,
versatile, xgene, altera, brcmstb, iproc, mediatek, mt7621, xilinx,
plda, and others
This patch updates error handling across these host controller drivers
so that callers consistently receive ERR_PTR() instead of NULL.
Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
---
arch/mips/pci/pci-xtalk-bridge.c | 4 ++--
drivers/pci/controller/cadence/pci-j721e.c | 4 ++--
drivers/pci/controller/cadence/pcie-cadence-plat.c | 4 ++--
drivers/pci/controller/dwc/pcie-designware-host.c | 4 ++--
drivers/pci/controller/dwc/pcie-qcom.c | 4 ++--
drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c | 4 ++--
drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c | 4 ++--
drivers/pci/controller/pci-aardvark.c | 4 ++--
drivers/pci/controller/pci-ftpci100.c | 4 ++--
drivers/pci/controller/pci-host-common.c | 4 ++--
drivers/pci/controller/pci-hyperv.c | 4 ++--
drivers/pci/controller/pci-ixp4xx.c | 4 ++--
drivers/pci/controller/pci-loongson.c | 4 ++--
drivers/pci/controller/pci-mvebu.c | 4 ++--
drivers/pci/controller/pci-rcar-gen2.c | 4 ++--
drivers/pci/controller/pci-tegra.c | 4 ++--
drivers/pci/controller/pci-v3-semi.c | 4 ++--
drivers/pci/controller/pci-versatile.c | 4 ++--
drivers/pci/controller/pci-xgene.c | 4 ++--
drivers/pci/controller/pcie-altera.c | 4 ++--
drivers/pci/controller/pcie-brcmstb.c | 4 ++--
drivers/pci/controller/pcie-iproc-bcma.c | 4 ++--
drivers/pci/controller/pcie-iproc-platform.c | 4 ++--
drivers/pci/controller/pcie-mediatek-gen3.c | 4 ++--
drivers/pci/controller/pcie-mediatek.c | 4 ++--
drivers/pci/controller/pcie-mt7621.c | 4 ++--
drivers/pci/controller/pcie-rcar-host.c | 4 ++--
drivers/pci/controller/pcie-rockchip-host.c | 4 ++--
drivers/pci/controller/pcie-xilinx-cpm.c | 4 ++--
drivers/pci/controller/pcie-xilinx-dma-pl.c | 4 ++--
drivers/pci/controller/pcie-xilinx-nwl.c | 4 ++--
drivers/pci/controller/pcie-xilinx.c | 4 ++--
drivers/pci/controller/plda/pcie-plda-host.c | 4 ++--
drivers/pci/probe.c | 8 ++++----
34 files changed, 70 insertions(+), 70 deletions(-)
diff --git a/arch/mips/pci/pci-xtalk-bridge.c b/arch/mips/pci/pci-xtalk-bridge.c
index e00c38620d14..c2c8ed8ecac1 100644
--- a/arch/mips/pci/pci-xtalk-bridge.c
+++ b/arch/mips/pci/pci-xtalk-bridge.c
@@ -636,8 +636,8 @@ static int bridge_probe(struct platform_device *pdev)
pci_set_flags(PCI_PROBE_ONLY);
host = devm_pci_alloc_host_bridge(dev, sizeof(*bc));
- if (!host) {
- err = -ENOMEM;
+ if (IS_ERR_OR_NULL(host)) {
+ err = PTR_ERR(host);
goto err_remove_domain;
}
diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
index 6c93f39d0288..3b8afaef21a6 100644
--- a/drivers/pci/controller/cadence/pci-j721e.c
+++ b/drivers/pci/controller/cadence/pci-j721e.c
@@ -475,8 +475,8 @@ static int j721e_pcie_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
if (!data->byte_access_allowed)
bridge->ops = &cdns_ti_pcie_host_ops;
diff --git a/drivers/pci/controller/cadence/pcie-cadence-plat.c b/drivers/pci/controller/cadence/pcie-cadence-plat.c
index 0456845dabb9..7570cb5998f6 100644
--- a/drivers/pci/controller/cadence/pcie-cadence-plat.c
+++ b/drivers/pci/controller/cadence/pcie-cadence-plat.c
@@ -66,8 +66,8 @@ static int cdns_plat_pcie_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
rc = pci_host_bridge_priv(bridge);
rc->pcie.dev = dev;
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index 952f8594b501..b2b99f275c19 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -467,8 +467,8 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
raw_spin_lock_init(&pp->lock);
bridge = devm_pci_alloc_host_bridge(dev, 0);
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pp->bridge = bridge;
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 294babe1816e..34d35c925c62 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -1809,8 +1809,8 @@ static int qcom_pcie_probe(struct platform_device *pdev)
struct pci_config_window *cfg;
bridge = devm_pci_alloc_host_bridge(dev, 0);
- if (!bridge) {
- ret = -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge)) {
+ ret = PTR_ERR(bridge);
goto err_pm_runtime_put;
}
diff --git a/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c b/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
index 4919b27eaf44..f9ebefc71be3 100644
--- a/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
+++ b/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
@@ -207,8 +207,8 @@ static int __init ls_g4_pcie_probe(struct platform_device *pdev)
}
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
mv_pci = &pcie->pci;
diff --git a/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c b/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c
index c5bb87ff6d9a..9d2e3b0bc866 100644
--- a/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c
+++ b/drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c
@@ -27,8 +27,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
/* allocate the PCIe port */
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
pcie->rp.bridge = bridge;
diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index e34bea1ff0ac..4b75a451efe4 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -1740,8 +1740,8 @@ static int advk_pcie_probe(struct platform_device *pdev)
int ret, irq;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
pcie->pdev = pdev;
diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
index 28e43831c0f1..0618d70fbdda 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -419,8 +419,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
u32 val;
host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
host->ops = &faraday_pci_ops;
p = pci_host_bridge_priv(host);
diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
index 810d1c8de24e..28c5d55062ed 100644
--- a/drivers/pci/controller/pci-host-common.c
+++ b/drivers/pci/controller/pci-host-common.c
@@ -60,8 +60,8 @@ int pci_host_common_init(struct platform_device *pdev,
struct pci_config_window *cfg;
bridge = devm_pci_alloc_host_bridge(dev, 0);
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
of_pci_check_probe_only();
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index d2b7e8ea710b..0b88e396c323 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -3759,8 +3759,8 @@ static int hv_pci_probe(struct hv_device *hdev,
int ret;
bridge = devm_pci_alloc_host_bridge(&hdev->device, 0);
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
hbus = kzalloc(sizeof(*hbus), GFP_KERNEL);
if (!hbus)
diff --git a/drivers/pci/controller/pci-ixp4xx.c b/drivers/pci/controller/pci-ixp4xx.c
index acb85e0d5675..422ec30757ee 100644
--- a/drivers/pci/controller/pci-ixp4xx.c
+++ b/drivers/pci/controller/pci-ixp4xx.c
@@ -528,8 +528,8 @@ static int __init ixp4xx_pci_probe(struct platform_device *pdev)
int i;
host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
host->ops = &ixp4xx_pci_ops;
p = pci_host_bridge_priv(host);
diff --git a/drivers/pci/controller/pci-loongson.c b/drivers/pci/controller/pci-loongson.c
index bc630ab8a283..b832d79faf52 100644
--- a/drivers/pci/controller/pci-loongson.c
+++ b/drivers/pci/controller/pci-loongson.c
@@ -326,8 +326,8 @@ static int loongson_pci_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*priv));
- if (!bridge)
- return -ENODEV;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
priv = pci_host_bridge_priv(bridge);
priv->pdev = pdev;
diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c
index a72aa57591c0..c0fd8efaf540 100644
--- a/drivers/pci/controller/pci-mvebu.c
+++ b/drivers/pci/controller/pci-mvebu.c
@@ -1456,8 +1456,8 @@ static int mvebu_pcie_probe(struct platform_device *pdev)
int num, i, ret;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct mvebu_pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
pcie->pdev = pdev;
diff --git a/drivers/pci/controller/pci-rcar-gen2.c b/drivers/pci/controller/pci-rcar-gen2.c
index d29866485361..845347e0317e 100644
--- a/drivers/pci/controller/pci-rcar-gen2.c
+++ b/drivers/pci/controller/pci-rcar-gen2.c
@@ -284,8 +284,8 @@ static int rcar_pci_probe(struct platform_device *pdev)
void __iomem *reg;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*priv));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
priv = pci_host_bridge_priv(bridge);
bridge->sysdata = priv;
diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c
index 467ddc701adc..dc45692e9906 100644
--- a/drivers/pci/controller/pci-tegra.c
+++ b/drivers/pci/controller/pci-tegra.c
@@ -2568,8 +2568,8 @@ static int tegra_pcie_probe(struct platform_device *pdev)
int err;
host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(host);
host->sysdata = pcie;
diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
index 460a825325dd..6f1f82e4228d 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -715,8 +715,8 @@ static int v3_pci_probe(struct platform_device *pdev)
int ret;
host = devm_pci_alloc_host_bridge(dev, sizeof(*v3));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
host->ops = &v3_pci_ops;
v3 = pci_host_bridge_priv(host);
diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index e9a6758fe2c1..b367c17db667 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -72,8 +72,8 @@ static int versatile_pci_probe(struct platform_device *pdev)
struct pci_host_bridge *bridge;
bridge = devm_pci_alloc_host_bridge(dev, 0);
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
versatile_pci_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(versatile_pci_base))
diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index b95afa35201d..3b3a6e08d17b 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -622,8 +622,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
"MSI driver not ready\n");
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
port = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index 3dbb7adc421c..92f976bea8ef 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -995,8 +995,8 @@ static int altera_pcie_probe(struct platform_device *pdev)
const struct altera_pcie_data *data;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
pcie->pdev = pdev;
diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c
index 9afbd02ded35..c683418c176c 100644
--- a/drivers/pci/controller/pcie-brcmstb.c
+++ b/drivers/pci/controller/pcie-brcmstb.c
@@ -1874,8 +1874,8 @@ static int brcm_pcie_probe(struct platform_device *pdev)
int ret;
bridge = devm_pci_alloc_host_bridge(&pdev->dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
data = of_device_get_match_data(&pdev->dev);
if (!data) {
diff --git a/drivers/pci/controller/pcie-iproc-bcma.c b/drivers/pci/controller/pcie-iproc-bcma.c
index 99a99900444d..d2adc4162a6c 100644
--- a/drivers/pci/controller/pcie-iproc-bcma.c
+++ b/drivers/pci/controller/pcie-iproc-bcma.c
@@ -39,8 +39,8 @@ static int iproc_bcma_pcie_probe(struct bcma_device *bdev)
int ret;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
index 0cb78c583c7e..8f6843ce573e 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -46,8 +46,8 @@ static int iproc_pltfm_pcie_probe(struct platform_device *pdev)
int ret;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 97147f43e41c..e3e908236238 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -1175,8 +1175,8 @@ static int mtk_pcie_probe(struct platform_device *pdev)
int err;
host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(host);
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 24cc30a2ab6c..7a2c74996ace 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -1083,8 +1083,8 @@ static int mtk_pcie_probe(struct platform_device *pdev)
int err;
host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!host)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(host);
diff --git a/drivers/pci/controller/pcie-mt7621.c b/drivers/pci/controller/pcie-mt7621.c
index 01ead2f92e87..9dfa5075b980 100644
--- a/drivers/pci/controller/pcie-mt7621.c
+++ b/drivers/pci/controller/pcie-mt7621.c
@@ -480,8 +480,8 @@ static int mt7621_pcie_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
pcie->dev = dev;
diff --git a/drivers/pci/controller/pcie-rcar-host.c b/drivers/pci/controller/pcie-rcar-host.c
index fe288fd770c4..47500ed59608 100644
--- a/drivers/pci/controller/pcie-rcar-host.c
+++ b/drivers/pci/controller/pcie-rcar-host.c
@@ -952,8 +952,8 @@ static int rcar_pcie_probe(struct platform_device *pdev)
int err;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*host));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
host = pci_host_bridge_priv(bridge);
pcie = &host->pcie;
diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index ee1822ca01db..225a5200f7a6 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -934,8 +934,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rockchip));
- if (!bridge)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
rockchip = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-xilinx-cpm.c b/drivers/pci/controller/pcie-xilinx-cpm.c
index d38f27e20761..1c14c5328ae0 100644
--- a/drivers/pci/controller/pcie-xilinx-cpm.c
+++ b/drivers/pci/controller/pcie-xilinx-cpm.c
@@ -574,8 +574,8 @@ static int xilinx_cpm_pcie_probe(struct platform_device *pdev)
int err;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port));
- if (!bridge)
- return -ENODEV;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
port = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-xilinx-dma-pl.c b/drivers/pci/controller/pcie-xilinx-dma-pl.c
index b037c8f315e4..0e68026671b8 100644
--- a/drivers/pci/controller/pcie-xilinx-dma-pl.c
+++ b/drivers/pci/controller/pcie-xilinx-dma-pl.c
@@ -771,8 +771,8 @@ static int xilinx_pl_dma_pcie_probe(struct platform_device *pdev)
int err;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port));
- if (!bridge)
- return -ENODEV;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
port = pci_host_bridge_priv(bridge);
diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index 05b8c205493c..a23f5e677c17 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -834,8 +834,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
int err;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENODEV;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
platform_set_drvdata(pdev, pcie);
diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
index 937ea6ae1ac4..7631af1ef6af 100644
--- a/drivers/pci/controller/pcie-xilinx.c
+++ b/drivers/pci/controller/pcie-xilinx.c
@@ -574,8 +574,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
return -ENODEV;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
- if (!bridge)
- return -ENODEV;
+ if (IS_ERR_OR_NULL(bridge))
+ return PTR_ERR(bridge);
pcie = pci_host_bridge_priv(bridge);
mutex_init(&pcie->map_lock);
diff --git a/drivers/pci/controller/plda/pcie-plda-host.c b/drivers/pci/controller/plda/pcie-plda-host.c
index 8e2db2e5b64b..28d638067adc 100644
--- a/drivers/pci/controller/plda/pcie-plda-host.c
+++ b/drivers/pci/controller/plda/pcie-plda-host.c
@@ -598,8 +598,8 @@ int plda_pcie_host_init(struct plda_pcie_rp *port, struct pci_ops *ops,
"failed to map config memory\n");
bridge = devm_pci_alloc_host_bridge(dev, 0);
- if (!bridge)
- return dev_err_probe(dev, -ENOMEM,
+ if (IS_ERR_OR_NULL(bridge))
+ return dev_err_probe(dev, PTR_ERR(bridge),
"failed to alloc bridge\n");
if (port->host_ops && port->host_ops->host_init) {
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index f41128f91ca7..e627f36b7683 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -686,18 +686,18 @@ struct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev,
bridge = pci_alloc_host_bridge(priv);
if (!bridge)
- return NULL;
+ return ERR_PTR(-ENOMEM);
bridge->dev.parent = dev;
ret = devm_add_action_or_reset(dev, devm_pci_alloc_host_bridge_release,
bridge);
if (ret)
- return NULL;
+ return ERR_PTR(ret);
ret = devm_of_pci_bridge_init(dev, bridge);
if (ret)
- return NULL;
+ return ERR_PTR(ret);
return bridge;
}
@@ -3198,7 +3198,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
bridge = pci_alloc_host_bridge(0);
if (!bridge)
- return NULL;
+ return ERR_PTR(-ENOMEM);
bridge->dev.parent = parent;
--
2.50.1
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns
2025-09-21 16:14 [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns Alok Tiwari
@ 2025-09-21 17:19 ` Marc Zyngier
2025-09-22 10:55 ` AngeloGioacchino Del Regno
1 sibling, 0 replies; 3+ messages in thread
From: Marc Zyngier @ 2025-09-21 17:19 UTC (permalink / raw)
To: Alok Tiwari
Cc: thomas.petazzoni, pali, lpieralisi, kwilczynski, mani, robh,
bhelgaas, joyce.ooi, alyssa, jim2101024, florian.fainelli,
bcm-kernel-feedback-list, rjui, sbranden, ryder.lee, jianjun.wang,
sergio.paracuellos, matthias.bgg, angelogioacchino.delregno,
marek.vasut+renesas, yoshihiro.shimoda.uh, geert+renesas,
magnus.damm, shawn.lin, heiko, michal.simek, bharat.kumar.gogada,
will, kys, haiyangz, wei.liu, decui, linus.walleij,
thierry.reding, jonathanh, rric, nirmal.patel, toan,
jonathan.derrick, linux-pci, linux-arm-kernel, linux-kernel,
linux-rpi-kernel, linux-mediatek, linux-renesas-soc,
linux-rockchip, linux-hyperv, linux-tegra
On Sun, 21 Sep 2025 17:14:07 +0100,
Alok Tiwari <alok.a.tiwari@oracle.com> wrote:
>
> devm_pci_alloc_host_bridge() and pci_alloc_host_bridge() previously
> returned NULL on failure, forcing callers to special-case NULL handling
> and often hardcode -ENOMEM as the error.
>
> This series updates devm_pci_alloc_host_bridge() to consistently return
> error pointers (ERR_PTR) with the actual error code, instead of NULL.
> All callers across PCI host controller drivers are updated to use
> IS_ERR_OR_NULL()/PTR_ERR() instead of NULL checks and hardcoded -ENOMEM.
>
> Benefits:
> - Standardizes error handling with Linux kernel ERR_PTR()/PTR_ERR()
> conventions.
> - Ensures that the actual error code from lower-level helpers is
> propagated back to the caller.
> - Removes ambiguity between NULL and error pointer returns.
>
> Touched drivers include:
> cadence (J721E, cadence-plat)
> dwc (designware, qcom)
> mobiveil (layerscape-gen4, mobiveil-plat)
> aardvark, ftpci100, ixp4xx, loongson, mvebu, rcar, tegra, v3-semi,
> versatile, xgene, altera, brcmstb, iproc, mediatek, mt7621, xilinx,
> plda, and others
>
> This patch updates error handling across these host controller drivers
> so that callers consistently receive ERR_PTR() instead of NULL.
Not quite.
> diff --git a/arch/mips/pci/pci-xtalk-bridge.c b/arch/mips/pci/pci-xtalk-bridge.c
> index e00c38620d14..c2c8ed8ecac1 100644
> --- a/arch/mips/pci/pci-xtalk-bridge.c
> +++ b/arch/mips/pci/pci-xtalk-bridge.c
> @@ -636,8 +636,8 @@ static int bridge_probe(struct platform_device *pdev)
> pci_set_flags(PCI_PROBE_ONLY);
>
> host = devm_pci_alloc_host_bridge(dev, sizeof(*bc));
> - if (!host) {
> - err = -ENOMEM;
> + if (IS_ERR_OR_NULL(host)) {
> + err = PTR_ERR(host);
Under which circumstances can NULL still be returned? Because applying
PTR_ERR() to a NULL pointer looks like a pretty bad idea.
> goto err_remove_domain;
> }
>
[...]
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index f41128f91ca7..e627f36b7683 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -686,18 +686,18 @@ struct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev,
>
> bridge = pci_alloc_host_bridge(priv);
> if (!bridge)
> - return NULL;
> + return ERR_PTR(-ENOMEM);
>
> bridge->dev.parent = dev;
>
> ret = devm_add_action_or_reset(dev, devm_pci_alloc_host_bridge_release,
> bridge);
> if (ret)
> - return NULL;
> + return ERR_PTR(ret);
>
> ret = devm_of_pci_bridge_init(dev, bridge);
> if (ret)
> - return NULL;
> + return ERR_PTR(ret);
>
> return bridge;
> }
> @@ -3198,7 +3198,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
>
> bridge = pci_alloc_host_bridge(0);
> if (!bridge)
> - return NULL;
> + return ERR_PTR(-ENOMEM);
>
> bridge->dev.parent = parent;
>
And what about the code that comes after that if we fail to register
the bus? The remaining "return NULL", which will then be interpreted
as 0 in any user of this function, leading to a worse situation than
what we have now.
Also, things like pci_scan_root_bus() have the following pattern:
b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
if (!b)
return NULL;
which will end with prejudice given what you have introduced.
If you are going to touch this sort of things, at least make it
consistent, analyse *all* code paths, and provide documentation.
M.
--
Jazz isn't dead. It just smells funny.
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns
2025-09-21 16:14 [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns Alok Tiwari
2025-09-21 17:19 ` Marc Zyngier
@ 2025-09-22 10:55 ` AngeloGioacchino Del Regno
1 sibling, 0 replies; 3+ messages in thread
From: AngeloGioacchino Del Regno @ 2025-09-22 10:55 UTC (permalink / raw)
To: Alok Tiwari, thomas.petazzoni, pali, lpieralisi, kwilczynski,
mani, robh, bhelgaas, joyce.ooi, alyssa, maz, jim2101024,
florian.fainelli, bcm-kernel-feedback-list, rjui, sbranden,
ryder.lee, jianjun.wang, sergio.paracuellos, matthias.bgg,
marek.vasut+renesas, yoshihiro.shimoda.uh, geert+renesas,
magnus.damm, shawn.lin, heiko, michal.simek, bharat.kumar.gogada,
will, kys, haiyangz, wei.liu, decui, linus.walleij,
thierry.reding, jonathanh, rric, nirmal.patel, toan,
jonathan.derrick, linux-pci
Cc: linux-arm-kernel, linux-kernel, linux-rpi-kernel, linux-mediatek,
linux-renesas-soc, linux-rockchip, linux-hyperv, linux-tegra
Il 21/09/25 18:14, Alok Tiwari ha scritto:
> devm_pci_alloc_host_bridge() and pci_alloc_host_bridge() previously
> returned NULL on failure, forcing callers to special-case NULL handling
> and often hardcode -ENOMEM as the error.
>
> This series updates devm_pci_alloc_host_bridge() to consistently return
> error pointers (ERR_PTR) with the actual error code, instead of NULL.
> All callers across PCI host controller drivers are updated to use
> IS_ERR_OR_NULL()/PTR_ERR() instead of NULL checks and hardcoded -ENOMEM.
>
> Benefits:
> - Standardizes error handling with Linux kernel ERR_PTR()/PTR_ERR()
> conventions.
> - Ensures that the actual error code from lower-level helpers is
> propagated back to the caller.
> - Removes ambiguity between NULL and error pointer returns.
>
> Touched drivers include:
> cadence (J721E, cadence-plat)
> dwc (designware, qcom)
> mobiveil (layerscape-gen4, mobiveil-plat)
> aardvark, ftpci100, ixp4xx, loongson, mvebu, rcar, tegra, v3-semi,
> versatile, xgene, altera, brcmstb, iproc, mediatek, mt7621, xilinx,
> plda, and others
>
> This patch updates error handling across these host controller drivers
> so that callers consistently receive ERR_PTR() instead of NULL.
>
I think that's a nice improvement - propagating the right error code looks good.
The only thing is - you have to make sure that it never returns NULL, so that
in the controller drivers you always check for `if (IS_ERR(x))` - otherwise with
the current IS_ERR_OR_NULL(x) most of the error paths are wrong.
Cheers,
Angelo
> Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
> ---
> arch/mips/pci/pci-xtalk-bridge.c | 4 ++--
> drivers/pci/controller/cadence/pci-j721e.c | 4 ++--
> drivers/pci/controller/cadence/pcie-cadence-plat.c | 4 ++--
> drivers/pci/controller/dwc/pcie-designware-host.c | 4 ++--
> drivers/pci/controller/dwc/pcie-qcom.c | 4 ++--
> drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c | 4 ++--
> drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c | 4 ++--
> drivers/pci/controller/pci-aardvark.c | 4 ++--
> drivers/pci/controller/pci-ftpci100.c | 4 ++--
> drivers/pci/controller/pci-host-common.c | 4 ++--
> drivers/pci/controller/pci-hyperv.c | 4 ++--
> drivers/pci/controller/pci-ixp4xx.c | 4 ++--
> drivers/pci/controller/pci-loongson.c | 4 ++--
> drivers/pci/controller/pci-mvebu.c | 4 ++--
> drivers/pci/controller/pci-rcar-gen2.c | 4 ++--
> drivers/pci/controller/pci-tegra.c | 4 ++--
> drivers/pci/controller/pci-v3-semi.c | 4 ++--
> drivers/pci/controller/pci-versatile.c | 4 ++--
> drivers/pci/controller/pci-xgene.c | 4 ++--
> drivers/pci/controller/pcie-altera.c | 4 ++--
> drivers/pci/controller/pcie-brcmstb.c | 4 ++--
> drivers/pci/controller/pcie-iproc-bcma.c | 4 ++--
> drivers/pci/controller/pcie-iproc-platform.c | 4 ++--
> drivers/pci/controller/pcie-mediatek-gen3.c | 4 ++--
> drivers/pci/controller/pcie-mediatek.c | 4 ++--
> drivers/pci/controller/pcie-mt7621.c | 4 ++--
> drivers/pci/controller/pcie-rcar-host.c | 4 ++--
> drivers/pci/controller/pcie-rockchip-host.c | 4 ++--
> drivers/pci/controller/pcie-xilinx-cpm.c | 4 ++--
> drivers/pci/controller/pcie-xilinx-dma-pl.c | 4 ++--
> drivers/pci/controller/pcie-xilinx-nwl.c | 4 ++--
> drivers/pci/controller/pcie-xilinx.c | 4 ++--
> drivers/pci/controller/plda/pcie-plda-host.c | 4 ++--
> drivers/pci/probe.c | 8 ++++----
> 34 files changed, 70 insertions(+), 70 deletions(-)
>
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-09-22 10:55 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-21 16:14 [PATCH RFC] PCI: Convert devm_pci_alloc_host_bridge() users to error-pointer returns Alok Tiwari
2025-09-21 17:19 ` Marc Zyngier
2025-09-22 10:55 ` AngeloGioacchino Del Regno
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).