]>
Commit | Line | Data |
---|---|---|
37554d48 SL |
1 | From 3f224593a4f09e8250c9fdb38fa0f9442909792d Mon Sep 17 00:00:00 2001 |
2 | From: Jisheng Zhang <Jisheng.Zhang@synaptics.com> | |
3 | Date: Fri, 29 Mar 2019 11:57:17 +0000 | |
4 | Subject: PCI: dwc: Free MSI IRQ page in dw_pcie_free_msi() | |
5 | ||
6 | [ Upstream commit dc69a3d567941784c3d00e1d0834582b42b0b3e7 ] | |
7 | ||
8 | To avoid a memory leak, free the page allocated for MSI IRQ in | |
9 | dw_pcie_free_msi(). | |
10 | ||
11 | Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com> | |
12 | Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | |
13 | Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> | |
14 | Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com> | |
15 | Signed-off-by: Sasha Levin <sashal@kernel.org> | |
16 | --- | |
17 | drivers/pci/controller/dwc/pcie-designware-host.c | 12 ++++++++---- | |
18 | drivers/pci/controller/dwc/pcie-designware.h | 1 + | |
19 | 2 files changed, 9 insertions(+), 4 deletions(-) | |
20 | ||
21 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c | |
22 | index 4eedb2c54ab3..acd50920c2ff 100644 | |
23 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c | |
24 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c | |
25 | @@ -303,20 +303,24 @@ void dw_pcie_free_msi(struct pcie_port *pp) | |
26 | ||
27 | irq_domain_remove(pp->msi_domain); | |
28 | irq_domain_remove(pp->irq_domain); | |
29 | + | |
30 | + if (pp->msi_page) | |
31 | + __free_page(pp->msi_page); | |
32 | } | |
33 | ||
34 | void dw_pcie_msi_init(struct pcie_port *pp) | |
35 | { | |
36 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); | |
37 | struct device *dev = pci->dev; | |
38 | - struct page *page; | |
39 | u64 msi_target; | |
40 | ||
41 | - page = alloc_page(GFP_KERNEL); | |
42 | - pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); | |
43 | + pp->msi_page = alloc_page(GFP_KERNEL); | |
44 | + pp->msi_data = dma_map_page(dev, pp->msi_page, 0, PAGE_SIZE, | |
45 | + DMA_FROM_DEVICE); | |
46 | if (dma_mapping_error(dev, pp->msi_data)) { | |
47 | dev_err(dev, "Failed to map MSI data\n"); | |
48 | - __free_page(page); | |
49 | + __free_page(pp->msi_page); | |
50 | + pp->msi_page = NULL; | |
51 | return; | |
52 | } | |
53 | msi_target = (u64)pp->msi_data; | |
54 | diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h | |
55 | index 9f1a5e399b70..14dcf6646699 100644 | |
56 | --- a/drivers/pci/controller/dwc/pcie-designware.h | |
57 | +++ b/drivers/pci/controller/dwc/pcie-designware.h | |
58 | @@ -164,6 +164,7 @@ struct pcie_port { | |
59 | struct irq_domain *irq_domain; | |
60 | struct irq_domain *msi_domain; | |
61 | dma_addr_t msi_data; | |
62 | + struct page *msi_page; | |
63 | u32 num_vectors; | |
64 | u32 irq_status[MAX_MSI_CTRLS]; | |
65 | raw_spinlock_t lock; | |
66 | -- | |
67 | 2.20.1 | |
68 |