Received: by 10.213.65.68 with SMTP id h4csp556006imn; Tue, 13 Mar 2018 12:56:44 -0700 (PDT) X-Google-Smtp-Source: AG47ELvVR26QShhsoWWRK9y0abKP5qsH29977U8MtD4TC+P+Wqp8v60w7ZQvUWJ3PHl3eHKSHkzc X-Received: by 10.98.246.16 with SMTP id x16mr1712905pfh.81.1520971004832; Tue, 13 Mar 2018 12:56:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520971004; cv=none; d=google.com; s=arc-20160816; b=ugZevIR6E1KpmJxM+RTyDvYL0C6+dDlys3EKon7smLRLLWOOpdfyL0900awO00k/oU pRPZY4bChvjH8KYL14dHffclDzPNPmZOF+H4psWZLlKz0xsog76yb4HFtQsrjutwodfs VhvILUx8lGg525y6CoElsTRd0dDwpH3R4Rqq6xcFd4lDV/PyE91yhwc1LxlN5IKzM5DM hUFm/aLYbwBn/i1i4b1CuDTVwFVTBkqYvlKtBKbVXpzCzLx/geGtcPBq5z2CTw3WetcQ 2qe2KiQHlnOqbzmHRwQnf0yHORxkVsmh2igUYyuvPDaAuzPe9wTUtg2uGRmi8bHCVRc/ Vc/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=vCK45//aqzvm5zn6U/al8D0sXdCBF3ab4HnV3SW/MJc=; b=yn4LCcKEFVTrKpZLNIFSQkeGVZNEGEyALTaIte8w01O3lJ8esGSknSjQ4qjAgBRjYe kpBWpPmggFtMyhdBnm3aslr7W6BQVaaqedLv8U61wQ5imv1FmZvg+bO29NdD2i1tTup9 65IpTUWTsoUJ+BnyBaZ/BzdMJ5IO8/BfOH1HjYqfLjDrxM4QEdMep0wc5Sueo1eOZR4L qLpb7Qqpa37RjGXYXfM1IJ+TGC1TKZoZXijZYY8pM+3fqB1IAQ1Ht9FRugaGQPVp70iv l+dClDF7BpPJ8G229de6fbXdYcV9PT17I23CuOE/1mTIrB8hYwbm0LCSfqrXIOKDOyEO QzBQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p3si667118pfh.84.2018.03.13.12.56.30; Tue, 13 Mar 2018 12:56:44 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752375AbeCMTzd (ORCPT + 99 others); Tue, 13 Mar 2018 15:55:33 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:1930 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751903AbeCMTzc (ORCPT ); Tue, 13 Mar 2018 15:55:32 -0400 X-Greylist: delayed 901 seconds by postgrey-1.27 at vger.kernel.org; Tue, 13 Mar 2018 15:55:31 EDT Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Tue, 13 Mar 2018 12:40:17 -0700 Received: from ubuntu.eng.vmware.com (unknown [10.33.74.215]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id B3C5F40BFE; Tue, 13 Mar 2018 12:40:29 -0700 (PDT) From: Ronak Doshi To: CC: , Ronak Doshi , Shrikrishna Khare , "VMware, Inc." , open list Subject: [PATCH net 1/2] vmxnet3: avoid xmit reset due to a race in vmxnet3 Date: Tue, 13 Mar 2018 12:40:08 -0700 Message-ID: <20180313194008.12852-1-doshir@vmware.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-001.vmware.com: doshir@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The field txNumDeferred is used by the driver to keep track of the number of packets it has pushed to the emulation. The driver increments it on pushing the packet to the emulation and the emulation resets it to 0 at the end of the transmit. There is a possibility of a race either when (a) ESX is under heavy load or (b) workload inside VM is of low packet rate. This race results in xmit hangs when network coalescing is disabled. This change creates a local copy of txNumDeferred and uses it to perform ring arithmetic. Reported-by: Noriho Tanaka Signed-off-by: Ronak Doshi Acked-by: Shrikrishna Khare --- drivers/net/vmxnet3/vmxnet3_drv.c | 13 ++++++++----- drivers/net/vmxnet3/vmxnet3_int.h | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 8b39c160743d..052eef2f729f 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -977,6 +977,8 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, { int ret; u32 count; + int numPkts; + int localTxNumDeferred; unsigned long flags; struct vmxnet3_tx_ctx ctx; union Vmxnet3_GenericDesc *gdesc; @@ -1075,12 +1077,12 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, #else gdesc = ctx.sop_txd; #endif + localTxNumDeferred = le32_to_cpu(tq->shared->txNumDeferred); if (ctx.mss) { gdesc->txd.hlen = ctx.eth_ip_hdr_size + ctx.l4_hdr_size; gdesc->txd.om = VMXNET3_OM_TSO; gdesc->txd.msscof = ctx.mss; - le32_add_cpu(&tq->shared->txNumDeferred, (skb->len - - gdesc->txd.hlen + ctx.mss - 1) / ctx.mss); + numPkts = (skb->len - gdesc->txd.hlen + ctx.mss - 1) / ctx.mss; } else { if (skb->ip_summed == CHECKSUM_PARTIAL) { gdesc->txd.hlen = ctx.eth_ip_hdr_size; @@ -1091,8 +1093,10 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, gdesc->txd.om = 0; gdesc->txd.msscof = 0; } - le32_add_cpu(&tq->shared->txNumDeferred, 1); + numPkts = 1; } + le32_add_cpu(&tq->shared->txNumDeferred, numPkts); + localTxNumDeferred += numPkts; if (skb_vlan_tag_present(skb)) { gdesc->txd.ti = 1; @@ -1118,8 +1122,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, spin_unlock_irqrestore(&tq->tx_lock, flags); - if (le32_to_cpu(tq->shared->txNumDeferred) >= - le32_to_cpu(tq->shared->txThreshold)) { + if (localTxNumDeferred >= le32_to_cpu(tq->shared->txThreshold)) { tq->shared->txNumDeferred = 0; VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_TXPROD + tq->qid * 8, diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 5ba222920e80..b94fdfd0b6f1 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h @@ -69,10 +69,10 @@ /* * Version numbers */ -#define VMXNET3_DRIVER_VERSION_STRING "1.4.11.0-k" +#define VMXNET3_DRIVER_VERSION_STRING "1.4.12.0-k" /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ -#define VMXNET3_DRIVER_VERSION_NUM 0x01040b00 +#define VMXNET3_DRIVER_VERSION_NUM 0x01040c00 #if defined(CONFIG_PCI_MSI) /* RSS only makes sense if MSI-X is supported. */ -- 2.11.0