|
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 |
|