Re: [PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread David Miller
From: 
Date: Mon, 14 May 2018 08:28:26 -0400

> The DMA mask must be set before, not after, the first DMA map operation, or
> the first DMA map operation could in theory fail on some systems.
> 
> Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
> Signed-off-by: Regis Duchesne 
> Acked-by: Ronak Doshi 

Applied and queued up for -stable.


Re: [PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread David Miller
From: 
Date: Mon, 14 May 2018 08:28:26 -0400

> The DMA mask must be set before, not after, the first DMA map operation, or
> the first DMA map operation could in theory fail on some systems.
> 
> Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
> Signed-off-by: Regis Duchesne 
> Acked-by: Ronak Doshi 

Applied and queued up for -stable.


[PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread hpreg
The DMA mask must be set before, not after, the first DMA map operation, or
the first DMA map operation could in theory fail on some systems.

Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
Signed-off-by: Regis Duchesne 
Acked-by: Ronak Doshi 
---
 drivers/net/vmxnet3/vmxnet3_drv.c | 50 +++
 drivers/net/vmxnet3/vmxnet3_int.h |  8 ---
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c 
b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9ebe2a6..ed58685 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2688,7 +2688,7 @@ vmxnet3_set_mac_addr(struct net_device *netdev, void *p)
 /*  initialization and cleanup routines  */
 
 static int
-vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
+vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)
 {
int err;
unsigned long mmio_start, mmio_len;
@@ -2700,30 +2700,12 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
return err;
}
 
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
-   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
-   dev_err(>dev,
-   "pci_set_consistent_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = true;
-   } else {
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
-   dev_err(>dev,
-   "pci_set_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = false;
-   }
-
err = pci_request_selected_regions(pdev, (1 << 2) - 1,
   vmxnet3_driver_name);
if (err) {
dev_err(>dev,
"Failed to request region for adapter: error %d\n", 
err);
-   goto err_set_mask;
+   goto err_enable_device;
}
 
pci_set_master(pdev);
@@ -2751,7 +2733,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
iounmap(adapter->hw_addr0);
 err_ioremap:
pci_release_selected_regions(pdev, (1 << 2) - 1);
-err_set_mask:
+err_enable_device:
pci_disable_device(pdev);
return err;
 }
@@ -3254,7 +3236,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 #endif
};
int err;
-   bool dma64 = false; /* stupid gcc */
+   bool dma64;
u32 ver;
struct net_device *netdev;
struct vmxnet3_adapter *adapter;
@@ -3300,6 +3282,24 @@ vmxnet3_probe_device(struct pci_dev *pdev,
adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
 
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
+   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
+   dev_err(>dev,
+   "pci_set_consistent_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = true;
+   } else {
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
+   dev_err(>dev,
+   "pci_set_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = false;
+   }
+
spin_lock_init(>cmd_lock);
adapter->adapter_pa = dma_map_single(>pdev->dev, adapter,
 sizeof(struct vmxnet3_adapter),
@@ -3307,7 +3307,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
if (dma_mapping_error(>pdev->dev, adapter->adapter_pa)) {
dev_err(>dev, "Failed to map dma\n");
err = -EFAULT;
-   goto err_dma_map;
+   goto err_set_mask;
}
adapter->shared = dma_alloc_coherent(
>pdev->dev,
@@ -3358,7 +3358,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
}
 #endif /* VMXNET3_RSS */
 
-   err = vmxnet3_alloc_pci_resources(adapter, );
+   err = vmxnet3_alloc_pci_resources(adapter);
if (err < 0)
goto err_alloc_pci;
 
@@ -3504,7 +3504,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 err_alloc_shared:
dma_unmap_single(>pdev->dev, adapter->adapter_pa,
 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE);
-err_dma_map:
+err_set_mask:
free_netdev(netdev);
return err;
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h 
b/drivers/net/vmxnet3/vmxnet3_int.h
index a332646..b379bed 100644
--- 

[PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread hpreg
The DMA mask must be set before, not after, the first DMA map operation, or
the first DMA map operation could in theory fail on some systems.

Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
Signed-off-by: Regis Duchesne 
Acked-by: Ronak Doshi 
---
 drivers/net/vmxnet3/vmxnet3_drv.c | 50 +++
 drivers/net/vmxnet3/vmxnet3_int.h |  8 ---
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c 
b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9ebe2a6..ed58685 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2688,7 +2688,7 @@ vmxnet3_set_mac_addr(struct net_device *netdev, void *p)
 /*  initialization and cleanup routines  */
 
 static int
-vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
+vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)
 {
int err;
unsigned long mmio_start, mmio_len;
@@ -2700,30 +2700,12 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
return err;
}
 
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
-   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
-   dev_err(>dev,
-   "pci_set_consistent_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = true;
-   } else {
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
-   dev_err(>dev,
-   "pci_set_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = false;
-   }
-
err = pci_request_selected_regions(pdev, (1 << 2) - 1,
   vmxnet3_driver_name);
if (err) {
dev_err(>dev,
"Failed to request region for adapter: error %d\n", 
err);
-   goto err_set_mask;
+   goto err_enable_device;
}
 
pci_set_master(pdev);
@@ -2751,7 +2733,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
iounmap(adapter->hw_addr0);
 err_ioremap:
pci_release_selected_regions(pdev, (1 << 2) - 1);
-err_set_mask:
+err_enable_device:
pci_disable_device(pdev);
return err;
 }
@@ -3254,7 +3236,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 #endif
};
int err;
-   bool dma64 = false; /* stupid gcc */
+   bool dma64;
u32 ver;
struct net_device *netdev;
struct vmxnet3_adapter *adapter;
@@ -3300,6 +3282,24 @@ vmxnet3_probe_device(struct pci_dev *pdev,
adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
 
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
+   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
+   dev_err(>dev,
+   "pci_set_consistent_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = true;
+   } else {
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
+   dev_err(>dev,
+   "pci_set_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = false;
+   }
+
spin_lock_init(>cmd_lock);
adapter->adapter_pa = dma_map_single(>pdev->dev, adapter,
 sizeof(struct vmxnet3_adapter),
@@ -3307,7 +3307,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
if (dma_mapping_error(>pdev->dev, adapter->adapter_pa)) {
dev_err(>dev, "Failed to map dma\n");
err = -EFAULT;
-   goto err_dma_map;
+   goto err_set_mask;
}
adapter->shared = dma_alloc_coherent(
>pdev->dev,
@@ -3358,7 +3358,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
}
 #endif /* VMXNET3_RSS */
 
-   err = vmxnet3_alloc_pci_resources(adapter, );
+   err = vmxnet3_alloc_pci_resources(adapter);
if (err < 0)
goto err_alloc_pci;
 
@@ -3504,7 +3504,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 err_alloc_shared:
dma_unmap_single(>pdev->dev, adapter->adapter_pa,
 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE);
-err_dma_map:
+err_set_mask:
free_netdev(netdev);
return err;
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h 
b/drivers/net/vmxnet3/vmxnet3_int.h
index a332646..b379bed 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++ 

[PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread hpreg
The DMA mask must be set before, not after, the first DMA map operation, or
the first DMA map operation could in theory fail on some systems.

Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
Signed-off-by: Regis Duchesne 
Acked-by: Ronak Doshi 
---
 drivers/net/vmxnet3/vmxnet3_drv.c | 50 +++
 drivers/net/vmxnet3/vmxnet3_int.h |  8 ---
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c 
b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9ebe2a6..ed58685 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2688,7 +2688,7 @@ vmxnet3_set_mac_addr(struct net_device *netdev, void *p)
 /*  initialization and cleanup routines  */
 
 static int
-vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
+vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)
 {
int err;
unsigned long mmio_start, mmio_len;
@@ -2700,30 +2700,12 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
return err;
}
 
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
-   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
-   dev_err(>dev,
-   "pci_set_consistent_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = true;
-   } else {
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
-   dev_err(>dev,
-   "pci_set_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = false;
-   }
-
err = pci_request_selected_regions(pdev, (1 << 2) - 1,
   vmxnet3_driver_name);
if (err) {
dev_err(>dev,
"Failed to request region for adapter: error %d\n", 
err);
-   goto err_set_mask;
+   goto err_enable_device;
}
 
pci_set_master(pdev);
@@ -2751,7 +2733,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
iounmap(adapter->hw_addr0);
 err_ioremap:
pci_release_selected_regions(pdev, (1 << 2) - 1);
-err_set_mask:
+err_enable_device:
pci_disable_device(pdev);
return err;
 }
@@ -3254,7 +3236,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 #endif
};
int err;
-   bool dma64 = false; /* stupid gcc */
+   bool dma64;
u32 ver;
struct net_device *netdev;
struct vmxnet3_adapter *adapter;
@@ -3300,6 +3282,24 @@ vmxnet3_probe_device(struct pci_dev *pdev,
adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
 
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
+   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
+   dev_err(>dev,
+   "pci_set_consistent_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = true;
+   } else {
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
+   dev_err(>dev,
+   "pci_set_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = false;
+   }
+
spin_lock_init(>cmd_lock);
adapter->adapter_pa = dma_map_single(>pdev->dev, adapter,
 sizeof(struct vmxnet3_adapter),
@@ -3307,7 +3307,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
if (dma_mapping_error(>pdev->dev, adapter->adapter_pa)) {
dev_err(>dev, "Failed to map dma\n");
err = -EFAULT;
-   goto err_dma_map;
+   goto err_set_mask;
}
adapter->shared = dma_alloc_coherent(
>pdev->dev,
@@ -3358,7 +3358,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
}
 #endif /* VMXNET3_RSS */
 
-   err = vmxnet3_alloc_pci_resources(adapter, );
+   err = vmxnet3_alloc_pci_resources(adapter);
if (err < 0)
goto err_alloc_pci;
 
@@ -3504,7 +3504,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 err_alloc_shared:
dma_unmap_single(>pdev->dev, adapter->adapter_pa,
 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE);
-err_dma_map:
+err_set_mask:
free_netdev(netdev);
return err;
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h 
b/drivers/net/vmxnet3/vmxnet3_int.h
index a332646..b379bed 100644
--- 

[PATCH net 1/2] vmxnet3: set the DMA mask before the first DMA map operation

2018-05-14 Thread hpreg
The DMA mask must be set before, not after, the first DMA map operation, or
the first DMA map operation could in theory fail on some systems.

Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU")
Signed-off-by: Regis Duchesne 
Acked-by: Ronak Doshi 
---
 drivers/net/vmxnet3/vmxnet3_drv.c | 50 +++
 drivers/net/vmxnet3/vmxnet3_int.h |  8 ---
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c 
b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9ebe2a6..ed58685 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2688,7 +2688,7 @@ vmxnet3_set_mac_addr(struct net_device *netdev, void *p)
 /*  initialization and cleanup routines  */
 
 static int
-vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
+vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)
 {
int err;
unsigned long mmio_start, mmio_len;
@@ -2700,30 +2700,12 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
return err;
}
 
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
-   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
-   dev_err(>dev,
-   "pci_set_consistent_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = true;
-   } else {
-   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
-   dev_err(>dev,
-   "pci_set_dma_mask failed\n");
-   err = -EIO;
-   goto err_set_mask;
-   }
-   *dma64 = false;
-   }
-
err = pci_request_selected_regions(pdev, (1 << 2) - 1,
   vmxnet3_driver_name);
if (err) {
dev_err(>dev,
"Failed to request region for adapter: error %d\n", 
err);
-   goto err_set_mask;
+   goto err_enable_device;
}
 
pci_set_master(pdev);
@@ -2751,7 +2733,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter 
*adapter, bool *dma64)
iounmap(adapter->hw_addr0);
 err_ioremap:
pci_release_selected_regions(pdev, (1 << 2) - 1);
-err_set_mask:
+err_enable_device:
pci_disable_device(pdev);
return err;
 }
@@ -3254,7 +3236,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 #endif
};
int err;
-   bool dma64 = false; /* stupid gcc */
+   bool dma64;
u32 ver;
struct net_device *netdev;
struct vmxnet3_adapter *adapter;
@@ -3300,6 +3282,24 @@ vmxnet3_probe_device(struct pci_dev *pdev,
adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
 
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
+   if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
+   dev_err(>dev,
+   "pci_set_consistent_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = true;
+   } else {
+   if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
+   dev_err(>dev,
+   "pci_set_dma_mask failed\n");
+   err = -EIO;
+   goto err_set_mask;
+   }
+   dma64 = false;
+   }
+
spin_lock_init(>cmd_lock);
adapter->adapter_pa = dma_map_single(>pdev->dev, adapter,
 sizeof(struct vmxnet3_adapter),
@@ -3307,7 +3307,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
if (dma_mapping_error(>pdev->dev, adapter->adapter_pa)) {
dev_err(>dev, "Failed to map dma\n");
err = -EFAULT;
-   goto err_dma_map;
+   goto err_set_mask;
}
adapter->shared = dma_alloc_coherent(
>pdev->dev,
@@ -3358,7 +3358,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
}
 #endif /* VMXNET3_RSS */
 
-   err = vmxnet3_alloc_pci_resources(adapter, );
+   err = vmxnet3_alloc_pci_resources(adapter);
if (err < 0)
goto err_alloc_pci;
 
@@ -3504,7 +3504,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
 err_alloc_shared:
dma_unmap_single(>pdev->dev, adapter->adapter_pa,
 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE);
-err_dma_map:
+err_set_mask:
free_netdev(netdev);
return err;
 }
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h 
b/drivers/net/vmxnet3/vmxnet3_int.h
index a332646..b379bed 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++