* [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup
@ 2026-07-22 23:12 Rosen Penev
2026-07-22 23:24 ` sashiko-bot
0 siblings, 1 reply; 2+ messages in thread
From: Rosen Penev @ 2026-07-22 23:12 UTC (permalink / raw)
To: linux-pci
Cc: Marc Zyngier, Lorenzo Pieralisi, Krzysztof Wilczyński,
Manivannan Sadhasivam, Rob Herring, Bjorn Helgaas,
Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
open list,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
Replace irq_of_parse_and_map() with fwnode_irq_get() on the PCIe
controller device's fwnode, indexed by port->idx. This is equivalent
for an OF-backed fwnode but uses the generic firmware-node API.
Unlike irq_of_parse_and_map(), fwnode_irq_get() returns a positive IRQ
or a negative errno and never 0 (it rewrites 0 to -EINVAL). So store
the result in an int and check for irq < 0, propagating the error
(including -EPROBE_DEFER) instead of the previous unsigned int with an
`if (!irq)` check that could never catch a negative failure.
Built for arm64 (defconfig + CONFIG_PCIE_APPLE) with LLVM=1;
drivers/pci/controller/pcie-apple.o compiles cleanly.
Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/pci/controller/pcie-apple.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c
index c2cffc0659f4..535acf274b78 100644
--- a/drivers/pci/controller/pcie-apple.c
+++ b/drivers/pci/controller/pcie-apple.c
@@ -400,14 +400,13 @@ static int apple_pcie_port_setup_irq(struct apple_pcie_port *port)
{
struct fwnode_handle *fwnode = &port->np->fwnode;
struct apple_pcie *pcie = port->pcie;
- unsigned int irq;
+ int irq;
u32 val = 0;
/* FIXME: consider moving each interrupt under each port */
- irq = irq_of_parse_and_map(to_of_node(dev_fwnode(port->pcie->dev)),
- port->idx);
- if (!irq)
- return -ENXIO;
+ irq = fwnode_irq_get(dev_fwnode(pcie->dev), port->idx);
+ if (irq < 0)
+ return irq;
port->domain = irq_domain_create_linear(fwnode, 32,
&apple_port_irq_domain_ops,
--
2.55.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup
2026-07-22 23:12 [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup Rosen Penev
@ 2026-07-22 23:24 ` sashiko-bot
0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-07-22 23:24 UTC (permalink / raw)
To: Rosen Penev; +Cc: linux-pci
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Missing teardown for partially initialized ports in `apple_pcie_init()` leaves dangling chained IRQ handlers and leaked IRQ domains, leading to a Use-After-Free on probe error.
- [High] MSI parent IRQ domain is leaked on probe failure, leading to Use-After-Free on re-probe.
--
--- Patch [1]: [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup ---
commit eab8bdc8d6046daad9b1ca1595a1c3a4a1b10540
Author: Rosen Penev <rosenp@gmail.com>
PCI: apple: use fwnode_irq_get() for port IRQ lookup
Replace irq_of_parse_and_map() with fwnode_irq_get() on the PCIe
controller device's fwnode. Propagate the error instead of checking
for zero, allowing negative errors like -EPROBE_DEFER to be handled.
> diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c
> index c2cffc0659f44..535acf274b786 100644
> --- a/drivers/pci/controller/pcie-apple.c
> +++ b/drivers/pci/controller/pcie-apple.c
> @@ -400,14 +400,13 @@ static int apple_pcie_port_setup_irq(struct apple_pcie_port *port)
> {
> struct fwnode_handle *fwnode = &port->np->fwnode;
> struct apple_pcie *pcie = port->pcie;
> - unsigned int irq;
> + int irq;
> u32 val = 0;
>
> /* FIXME: consider moving each interrupt under each port */
> - irq = irq_of_parse_and_map(to_of_node(dev_fwnode(port->pcie->dev)),
> - port->idx);
> - if (!irq)
> - return -ENXIO;
> + irq = fwnode_irq_get(dev_fwnode(pcie->dev), port->idx);
> + if (irq < 0)
> + return irq;
[Severity: High]
This isn't a bug introduced by this patch, but returning the error here
(which can now be -EPROBE_DEFER) exposes a missing teardown path in
apple_pcie_init().
When apple_pcie_port_setup_irq() returns an error, apple_pcie_setup_port()
and then apple_pcie_init() abort without tearing down previously initialized
ports:
drivers/pci/controller/pcie-apple.c:apple_pcie_init() {
...
for_each_available_child_of_node_scoped(dev->of_node, of_port) {
ret = apple_pcie_setup_port(pcie, of_port);
if (ret) {
dev_err(dev, "Port %pOF setup fail: %d\n", of_port, ret);
return ret;
}
}
...
}
Because the chained handlers (irq_set_chained_handler_and_data) and IRQ
domains (irq_domain_create_linear) set up for previous ports are not managed
by devres, they remain active.
Devres will free the port structures, so if an interrupt fires or a re-probe
occurs, won't apple_port_irq_handler() dereference a freed port pointer?
[Severity: High]
This is also a pre-existing issue, but propagating an error like
-EPROBE_DEFER here makes a leak in apple_pcie_probe() much more reachable.
If this error propagates up and causes pci_host_common_init() to fail in
apple_pcie_probe(), the MSI parent IRQ domain created earlier by
apple_msi_init() is not removed:
drivers/pci/controller/pcie-apple.c:apple_pcie_probe() {
...
ret = apple_msi_init(pcie);
if (ret)
return ret;
...
return pci_host_common_init(pdev, bridge, &apple_pcie_cfg_ecam_ops);
}
The domain created via msi_create_parent_irq_domain() is not devres-managed.
Devres will free the pcie structure on error, leaving the leaked domain's
host_data pointing to freed memory.
On re-probe, IRQ lookups will match the leaked domain, and
apple_msi_domain_alloc() will dereference the freed pcie pointer.
Should there be manual cleanup for the MSI domain when pci_host_common_init()
fails?
>
> port->domain = irq_domain_create_linear(fwnode, 32,
> &apple_port_irq_domain_ops,
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260722231214.857760-1-rosenp@gmail.com?part=1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-22 23:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-22 23:12 [PATCH] PCI: apple: use fwnode_irq_get() for port IRQ lookup Rosen Penev
2026-07-22 23:24 ` sashiko-bot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.