mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
PCI: xilinx-xdma: Fix device node reference leak in xilinx_pl_dma_pcie_init_irq_domain()
xilinx_pl_dma_pcie_init_irq_domain() takes a reference to the PCIe
interrupt-controller child node with of_get_child_by_name(), but the
error paths after the two irq_domain_create_linear() calls and after
xilinx_pl_dma_pcie_init_msi_irq_domain() return directly without
dropping it. irq_domain_create_linear() gets its own reference on the
fwnode, so the domains do not consume the caller's one.
Add an err_put_node label that drops the reference before returning.
Fixes: 8d786149d7 ("PCI: xilinx-xdma: Add Xilinx XDMA Root Port driver")
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260917132459.2153240-1-vulab@iscas.ac.cn
This commit is contained in:
parent
cee9395acd
commit
73d3d81832
|
|
@ -581,7 +581,7 @@ static int xilinx_pl_dma_pcie_init_irq_domain(struct pl_dma_pcie *port)
|
|||
port->pldma_domain = irq_domain_create_linear(of_fwnode_handle(pcie_intc_node), 32,
|
||||
&event_domain_ops, port);
|
||||
if (!port->pldma_domain)
|
||||
return -ENOMEM;
|
||||
goto err_put_node;
|
||||
|
||||
irq_domain_update_bus_token(port->pldma_domain, DOMAIN_BUS_NEXUS);
|
||||
|
||||
|
|
@ -589,7 +589,7 @@ static int xilinx_pl_dma_pcie_init_irq_domain(struct pl_dma_pcie *port)
|
|||
&intx_domain_ops, port);
|
||||
if (!port->intx_domain) {
|
||||
dev_err(dev, "Failed to get a INTx IRQ domain\n");
|
||||
return -ENOMEM;
|
||||
goto err_put_node;
|
||||
}
|
||||
|
||||
irq_domain_update_bus_token(port->intx_domain, DOMAIN_BUS_WIRED);
|
||||
|
|
@ -597,13 +597,17 @@ static int xilinx_pl_dma_pcie_init_irq_domain(struct pl_dma_pcie *port)
|
|||
ret = xilinx_pl_dma_pcie_init_msi_irq_domain(port);
|
||||
if (ret != 0) {
|
||||
irq_domain_remove(port->intx_domain);
|
||||
return -ENOMEM;
|
||||
goto err_put_node;
|
||||
}
|
||||
|
||||
of_node_put(pcie_intc_node);
|
||||
raw_spin_lock_init(&port->lock);
|
||||
|
||||
return 0;
|
||||
|
||||
err_put_node:
|
||||
of_node_put(pcie_intc_node);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int xilinx_pl_dma_pcie_setup_irq(struct pl_dma_pcie *port)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user