mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
[ Upstream commit8161e9626b] If dw_pcie_ep_init() fails to perform any action after the EPC memory is initialized and the MSI memory region is allocated, the latter parts won't be undone thus causing a memory leak. Add a cleanup-on-error path to fix these leaks. [bhelgaas: commit log] Fixes:2fd0c9d966("PCI: designware-ep: Pre-allocate memory for MSI in dw_pcie_ep_init") Link: https://lore.kernel.org/r/20220624143428.8334-6-Sergey.Semin@baikalelectronics.ru Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Rob Herring <robh@kernel.org> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
80d9f6541e
commit
e7599a5974
|
|
@ -773,8 +773,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||||
ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
|
ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
|
||||||
epc->mem->window.page_size);
|
epc->mem->window.page_size);
|
||||||
if (!ep->msi_mem) {
|
if (!ep->msi_mem) {
|
||||||
|
ret = -ENOMEM;
|
||||||
dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
|
dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
|
||||||
return -ENOMEM;
|
goto err_exit_epc_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ep->ops->get_features) {
|
if (ep->ops->get_features) {
|
||||||
|
|
@ -783,6 +784,19 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dw_pcie_ep_init_complete(ep);
|
ret = dw_pcie_ep_init_complete(ep);
|
||||||
|
if (ret)
|
||||||
|
goto err_free_epc_mem;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_free_epc_mem:
|
||||||
|
pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
|
||||||
|
epc->mem->window.page_size);
|
||||||
|
|
||||||
|
err_exit_epc_mem:
|
||||||
|
pci_epc_mem_exit(epc);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dw_pcie_ep_init);
|
EXPORT_SYMBOL_GPL(dw_pcie_ep_init);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user