From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753206Ab1AOA7x (ORCPT ); Fri, 14 Jan 2011 19:59:53 -0500 Received: from smtp-outbound-2.vmware.com ([65.115.85.73]:4722 "EHLO smtp-outbound-2.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753194Ab1AOA7v (ORCPT ); Fri, 14 Jan 2011 19:59:51 -0500 Subject: [PATCH net-next 6/8] vmxnet3: Disable napi in suspend, reenable in resume. To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org From: Shreyas N Bhatewara Cc: pv-drivers@vmware.com, Dmitry Torokhov Date: Fri, 14 Jan 2011 16:59:52 -0800 Message-ID: <20110115005952.1064.9985.stgit@sbhatewara-dev1.eng.vmware.com> In-Reply-To: <20110115005701.1064.67435.stgit@sbhatewara-dev1.eng.vmware.com> References: <20110115005701.1064.67435.stgit@sbhatewara-dev1.eng.vmware.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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: Shreyas N Bhatewara Acked-by: Dmitry Torokhov --- drivers/net/vmxnet3/vmxnet3_drv.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index a1632a9..20ef4f3 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -3101,6 +3101,9 @@ vmxnet3_suspend(struct device *device) if (!netif_running(netdev)) return 0; + for (i = 0; i < adapter->num_rx_queues; i++) + napi_disable(&adapter->rx_queue[i].napi); + vmxnet3_disable_all_intrs(adapter); vmxnet3_free_irqs(adapter); vmxnet3_free_intr_resources(adapter); @@ -3192,7 +3195,7 @@ skip_arp: static int vmxnet3_resume(struct device *device) { - int err; + int err, i = 0; struct pci_dev *pdev = to_pci_dev(device); struct net_device *netdev = pci_get_drvdata(pdev); struct vmxnet3_adapter *adapter = netdev_priv(netdev); @@ -3224,6 +3227,8 @@ vmxnet3_resume(struct device *device) VMXNET3_CMD_UPDATE_PMCFG); vmxnet3_alloc_intr_resources(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); return 0;