diff mbox

[1/1] Fix bug where remove of device fails to free all resources.

Message ID 1456864492-32257-2-git-send-email-dougmill@linux.vnet.ibm.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Douglas Miller March 1, 2016, 8:34 p.m. UTC
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(-)

Comments

David Miller March 3, 2016, 9:51 p.m. UTC | #1
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 mbox

Patch

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