Message ID | 1456864492-32257-2-git-send-email-dougmill@linux.vnet.ibm.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Douglas Miller <dougmill@linux.vnet.ibm.com> Date: Tue, 1 Mar 2016 14:34:52 -0600 > The adapter->pcicfg resource is either mapped via pci_iomap() or > derived from adapter->db. During be_remove() this resource was ignored > and so could remain mapped after remove. > > Add a flag to track whether adapter->pcicfg was mapped or not, then > use that flag in be_unmap_pci_bars() to unmap if required. > > Signed-off-by: Douglas Miller <dougmill@linux.vnet.ibm.com> You subject line need to mention the most relevant subsystem that your change is too, otherwise people scanning the shortlog have no idea where your change is taking place. And your description needs to be more concise. In this instance an appropriate Subject line would be: [PATCH] be2net: Don't leak iomapped memory on removal. > @@ -5019,8 +5021,10 @@ static int be_map_pci_bars(struct be_adapter *adapter) > if (!addr) > goto pci_map_err; > adapter->pcicfg = addr; > + adapter->pcicfg_mapped = 1; > } else { > adapter->pcicfg = adapter->db + SRIOV_VF_PCICFG_OFFSET; > + adapter->pcicfg_mapped = 0; > } Bool variables take on the values "true" and "false" so please use them.
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index cf83783..f975129 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h @@ -531,6 +531,7 @@ struct be_adapter { struct delayed_work be_err_detection_work; u8 err_flags; + bool pcicfg_mapped; /* pcicfg obtained via pci_iomap() */ u32 flags; u32 cmd_privileges; /* Ethtool knobs and info */ diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index f99de36..a79b8a5 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -4968,6 +4968,8 @@ static void be_unmap_pci_bars(struct be_adapter *adapter) pci_iounmap(adapter->pdev, adapter->csr); if (adapter->db) pci_iounmap(adapter->pdev, adapter->db); + if (adapter->pcicfg && adapter->pcicfg_mapped) + pci_iounmap(adapter->pdev, adapter->pcicfg); } static int db_bar(struct be_adapter *adapter) @@ -5019,8 +5021,10 @@ static int be_map_pci_bars(struct be_adapter *adapter) if (!addr) goto pci_map_err; adapter->pcicfg = addr; + adapter->pcicfg_mapped = 1; } else { adapter->pcicfg = adapter->db + SRIOV_VF_PCICFG_OFFSET; + adapter->pcicfg_mapped = 0; } }
The adapter->pcicfg resource is either mapped via pci_iomap() or derived from adapter->db. During be_remove() this resource was ignored and so could remain mapped after remove. Add a flag to track whether adapter->pcicfg was mapped or not, then use that flag in be_unmap_pci_bars() to unmap if required. Signed-off-by: Douglas Miller <dougmill@linux.vnet.ibm.com> --- drivers/net/ethernet/emulex/benet/be.h | 1 + drivers/net/ethernet/emulex/benet/be_main.c | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-)