From: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Date: Fri, 24 Jun 2022 17:34:15 +0300
Subject: PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
Git-commit: 8161e9626b50892eaedbd8070ecb1586ecedb109
Patch-mainline: v6.0-rc1
References: git-fixes
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: 2fd0c9d966cc ("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>
[Yousaf]: call to pci_epc_mem_free_addr() dropped
Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de>
---
drivers/pci/dwc/pcie-designware-ep.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
--- a/drivers/pci/dwc/pcie-designware-ep.c
+++ b/drivers/pci/dwc/pcie-designware-ep.c
@@ -394,8 +394,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *e
ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
epc->mem->page_size);
if (!ep->msi_mem) {
+ ret = -ENOMEM;
dev_err(dev, "Failed to reserve memory for MSI\n");
- return -ENOMEM;
+ goto err_exit_epc_mem;
}
ep->epc = epc;
@@ -403,4 +404,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *e
dw_pcie_setup(pci);
return 0;
+
+err_exit_epc_mem:
+ pci_epc_mem_exit(epc);
+
+ return ret;
}