lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 302/545] PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
    Date
    From: Serge Semin <Sergey.Semin@baikalelectronics.ru>

    [ Upstream commit 8161e9626b50892eaedbd8070ecb1586ecedb109 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../pci/controller/dwc/pcie-designware-ep.c | 18 ++++++++++++++++--
    1 file changed, 16 insertions(+), 2 deletions(-)

    diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
    index ad7da4ea43a5..95ed719402d7 100644
    --- a/drivers/pci/controller/dwc/pcie-designware-ep.c
    +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
    @@ -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,
    epc->mem->window.page_size);
    if (!ep->msi_mem) {
    + ret = -ENOMEM;
    dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
    - return -ENOMEM;
    + goto err_exit_epc_mem;
    }

    if (ep->ops->get_features) {
    @@ -783,6 +784,19 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
    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);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-19 18:24    [W:4.027 / U:1.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site