Takashi Iwai 5b1090
From 8161e9626b50892eaedbd8070ecb1586ecedb109 Mon Sep 17 00:00:00 2001
Takashi Iwai 5b1090
From: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Takashi Iwai 5b1090
Date: Fri, 24 Jun 2022 17:34:15 +0300
Takashi Iwai 5b1090
Subject: [PATCH] PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
Takashi Iwai 5b1090
Git-commit: 8161e9626b50892eaedbd8070ecb1586ecedb109
Takashi Iwai 5b1090
Patch-mainline: v6.0-rc1
Takashi Iwai 5b1090
References: git-fixes
Takashi Iwai 5b1090
Takashi Iwai 5b1090
If dw_pcie_ep_init() fails to perform any action after the EPC memory is
Takashi Iwai 5b1090
initialized and the MSI memory region is allocated, the latter parts won't
Takashi Iwai 5b1090
be undone thus causing a memory leak.  Add a cleanup-on-error path to fix
Takashi Iwai 5b1090
these leaks.
Takashi Iwai 5b1090
Takashi Iwai 5b1090
[bhelgaas: commit log]
Takashi Iwai 5b1090
Fixes: 2fd0c9d966cc ("PCI: designware-ep: Pre-allocate memory for MSI in dw_pcie_ep_init")
Takashi Iwai 5b1090
Link: https://lore.kernel.org/r/20220624143428.8334-6-Sergey.Semin@baikalelectronics.ru
Takashi Iwai 5b1090
Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Takashi Iwai 5b1090
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Takashi Iwai 5b1090
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Takashi Iwai 5b1090
Reviewed-by: Rob Herring <robh@kernel.org>
Takashi Iwai 5b1090
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Takashi Iwai 5b1090
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 5b1090
Takashi Iwai 5b1090
---
Takashi Iwai 5b1090
 .../pci/controller/dwc/pcie-designware-ep.c    | 18 ++++++++++++++++--
Takashi Iwai 5b1090
 1 file changed, 16 insertions(+), 2 deletions(-)
Takashi Iwai 5b1090
Takashi Iwai 5b1090
diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
Takashi Iwai 5b1090
index 0eda8236c125..13c2e73f0eaf 100644
Takashi Iwai 5b1090
--- a/drivers/pci/controller/dwc/pcie-designware-ep.c
Takashi Iwai 5b1090
+++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
Takashi Iwai 5b1090
@@ -780,8 +780,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
Takashi Iwai 5b1090
 	ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
Takashi Iwai 5b1090
 					     epc->mem->window.page_size);
Takashi Iwai 5b1090
 	if (!ep->msi_mem) {
Takashi Iwai 5b1090
+		ret = -ENOMEM;
Takashi Iwai 5b1090
 		dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
Takashi Iwai 5b1090
-		return -ENOMEM;
Takashi Iwai 5b1090
+		goto err_exit_epc_mem;
Takashi Iwai 5b1090
 	}
Takashi Iwai 5b1090
 
Takashi Iwai 5b1090
 	if (ep->ops->get_features) {
Takashi Iwai 5b1090
@@ -790,6 +791,19 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
Takashi Iwai 5b1090
 			return 0;
Takashi Iwai 5b1090
 	}
Takashi Iwai 5b1090
 
Takashi Iwai 5b1090
-	return dw_pcie_ep_init_complete(ep);
Takashi Iwai 5b1090
+	ret = dw_pcie_ep_init_complete(ep);
Takashi Iwai 5b1090
+	if (ret)
Takashi Iwai 5b1090
+		goto err_free_epc_mem;
Takashi Iwai 5b1090
+
Takashi Iwai 5b1090
+	return 0;
Takashi Iwai 5b1090
+
Takashi Iwai 5b1090
+err_free_epc_mem:
Takashi Iwai 5b1090
+	pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
Takashi Iwai 5b1090
+			      epc->mem->window.page_size);
Takashi Iwai 5b1090
+
Takashi Iwai 5b1090
+err_exit_epc_mem:
Takashi Iwai 5b1090
+	pci_epc_mem_exit(epc);
Takashi Iwai 5b1090
+
Takashi Iwai 5b1090
+	return ret;
Takashi Iwai 5b1090
 }
Takashi Iwai 5b1090
 EXPORT_SYMBOL_GPL(dw_pcie_ep_init);
Takashi Iwai 5b1090
-- 
Takashi Iwai 5b1090
2.35.3
Takashi Iwai 5b1090