Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51956cd6 authored by Shreyas Bhatewara's avatar Shreyas Bhatewara Committed by David S. Miller
Browse files

vmxnet3: Disable napi in suspend, reenable in resume.



There is a small possibility of a race where the suspend routine gets
called, while a napi callback is still pending and when that comes up,
it enables interrupts which just got disabled in the suspend routine.
This change adds napi disable call in suspend and enable in resume to
avoid race.

Signed-off-by: default avatarShreyas N Bhatewara <sbhatewara@vmware.com>
Acked-by: default avatarDmitry Torokhov <dtor@vmware.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 76d39dae
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -3101,6 +3101,9 @@ vmxnet3_suspend(struct device *device)
	if (!netif_running(netdev))
	if (!netif_running(netdev))
		return 0;
		return 0;


	for (i = 0; i < adapter->num_rx_queues; i++)
		napi_disable(&adapter->rx_queue[i].napi);

	vmxnet3_disable_all_intrs(adapter);
	vmxnet3_disable_all_intrs(adapter);
	vmxnet3_free_irqs(adapter);
	vmxnet3_free_irqs(adapter);
	vmxnet3_free_intr_resources(adapter);
	vmxnet3_free_intr_resources(adapter);
@@ -3192,7 +3195,7 @@ vmxnet3_suspend(struct device *device)
static int
static int
vmxnet3_resume(struct device *device)
vmxnet3_resume(struct device *device)
{
{
	int err;
	int err, i = 0;
	struct pci_dev *pdev = to_pci_dev(device);
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *netdev = pci_get_drvdata(pdev);
	struct net_device *netdev = pci_get_drvdata(pdev);
	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
@@ -3224,6 +3227,8 @@ vmxnet3_resume(struct device *device)
			       VMXNET3_CMD_UPDATE_PMCFG);
			       VMXNET3_CMD_UPDATE_PMCFG);
	vmxnet3_alloc_intr_resources(adapter);
	vmxnet3_alloc_intr_resources(adapter);
	vmxnet3_request_irqs(adapter);
	vmxnet3_request_irqs(adapter);
	for (i = 0; i < adapter->num_rx_queues; i++)
		napi_enable(&adapter->rx_queue[i].napi);
	vmxnet3_enable_all_intrs(adapter);
	vmxnet3_enable_all_intrs(adapter);


	return 0;
	return 0;