From patchwork Mon Nov 27 12:53:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Pundir X-Patchwork-Id: 119696 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp220836qgn; Mon, 27 Nov 2017 04:54:03 -0800 (PST) X-Google-Smtp-Source: AGs4zMY6hJYHHZZwGmDmqGXDoqrsGJf2vPfFysurW+7CLLQ8c6CliGaRpeQutqFdEahIRiEOrSDv X-Received: by 10.101.64.71 with SMTP id h7mr25235414pgp.144.1511787243456; Mon, 27 Nov 2017 04:54:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511787243; cv=none; d=google.com; s=arc-20160816; b=OBD2kIKiyU7byUgBSOXa+YeSs4TFr7OY9ktpHogvO7rfbyIn5NZcUpuIkgamltxLnl jH/ZFz9zdiG7J/r8Z+kgNmfHdxDA+jqJVPH3kYjGbhSiBUBUp6pfuCTHi6M+uu6cPKUy tyNuptabRIuMqAQ+8tFOxaKDykpZzoqb6in+huvj5t13IX/KwF+xjO9dgl4G2cagD8pK 1wKdXKaF6TawZLVTchw8XEV5YqkPQ6U1vHHH/MHXvD+R0+abl0Khei+3XUwCQ5v86D7H q3rxyKo7R4YXLg6/JhfAfm1WAlFD8rpJrntc1Igh/4vZqLocF7CGDxeNbJPqarWVUmza Iqew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=uCVyQPms9afGojB1d+NXgUWjb9bPyZAoJYdHR62Ypos=; b=R4Ib6TetOEkTytY4CMt6v8+MvFZrkdhEkwPb/oe6T1oUD9uxFpn6kA789bAf65Zdiw Wbmp6sEJeyfX3KLemHGXcvB3EIqUjiBLLBG7viHFuLBmMBsVT4TjPx0s/5C9gary7tvG EqpWMIZuy00l58Xdd0VpspmaRPugnshvnajspi6b07mTDGkpVzYRuVejYUpIjKGiIh/6 8iwfklJz2wsbc13Rk3CJR0GWO/wApMRnn7Te/flaDzJPCl2AfeqLsHcmFjYYbi1oGPg+ LOxCd9iEBasl81rpzPL7blkLaannooIQKlweh6J+wsML5aD1D2J7vLkwuHG9AfIDauBM g2OA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TNqoJ5ek; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m11si11333606pls.698.2017.11.27.04.54.03; Mon, 27 Nov 2017 04:54:03 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TNqoJ5ek; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752385AbdK0Mx6 (ORCPT + 9 others); Mon, 27 Nov 2017 07:53:58 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:41081 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752372AbdK0Mxz (ORCPT ); Mon, 27 Nov 2017 07:53:55 -0500 Received: by mail-pl0-f67.google.com with SMTP id u14so8424343plm.8 for ; Mon, 27 Nov 2017 04:53:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uCVyQPms9afGojB1d+NXgUWjb9bPyZAoJYdHR62Ypos=; b=TNqoJ5ekugFOd9LgtlS9sLvsqr4sHQ6Cwdnugdz1GuNU+K3a010tQ/UZksdyZ8zJcj ZfYp2z/skU7cVGMGYivHBkjZ0uqbSamXoAEsQnWq40hOsUGkv+ARa34JZpExYapGj/DL TOCQrIhoYDwJBftW6HUIupSkAsK9FomDhiCPk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=uCVyQPms9afGojB1d+NXgUWjb9bPyZAoJYdHR62Ypos=; b=FdnPyUhpoUetkfAUnuaMUYPZhfMgi8GQV2ejq6Fym7YwCyw+mawKFqXgJPwo52x82I 0CZtBB2GqW8OqirM2cnnNw3q6PlZccZu8v2IQK0GFYebFKi9dRYLRwHRqDdPrKOgJwqj lMNBC+OY1YUdURROG0O/RjhbT/b5xpTytLDB0/8eGb6wbjNQ82GQDdj1gLPu6jNsr6oD jbcEB86p8yGIuXq8G9B5Tw7HTRu7cRMj3sX7bJSuZFFeqczjHxAHbL4uEC1FKextmFJG ErjfbEjR7hi3xW+W9z3R+Tgo0UW/VaLKkJfaYVhTF1DcZpGCEhvWS6On1NbxCZmliS2/ 8CNg== X-Gm-Message-State: AJaThX7ivxVbDYqpwhG2FZcUFJ/0qkqfPAS+Opo+pFdOIYZTVg0gnugg JaszudpD0YX14C+FTg1mExR5TWLUyVM= X-Received: by 10.159.231.23 with SMTP id w23mr38948640plq.436.1511787234457; Mon, 27 Nov 2017 04:53:54 -0800 (PST) Received: from localhost.localdomain ([106.51.17.194]) by smtp.gmail.com with ESMTPSA id i187sm51792658pfc.96.2017.11.27.04.53.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 27 Nov 2017 04:53:53 -0800 (PST) From: Amit Pundir To: Greg KH Cc: Benjamin Poirier , Sasha Neftin , Stable , Jeff Kirsher Subject: [PATCH for-4.14.y 4/5] e1000e: Avoid receiver overrun interrupt bursts Date: Mon, 27 Nov 2017 18:23:36 +0530 Message-Id: <1511787217-10987-5-git-send-email-amit.pundir@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511787217-10987-1-git-send-email-amit.pundir@linaro.org> References: <1511787217-10987-1-git-send-email-amit.pundir@linaro.org> Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Benjamin Poirier commit 4aea7a5c5e940c1723add439f4088844cd26196d upstream. When e1000e_poll() is not fast enough to keep up with incoming traffic, the adapter (when operating in msix mode) raises the Other interrupt to signal Receiver Overrun. This is a double problem because 1) at the moment e1000_msix_other() assumes that it is only called in case of Link Status Change and 2) if the condition persists, the interrupt is repeatedly raised again in quick succession. Ideally we would configure the Other interrupt to not be raised in case of receiver overrun but this doesn't seem possible on this adapter. Instead, we handle the first part of the problem by reverting to the practice of reading ICR in the other interrupt handler, like before commit 16ecba59bc33 ("e1000e: Do not read ICR in Other interrupt"). Thanks to commit 0a8047ac68e5 ("e1000e: Fix msi-x interrupt automask") which cleared IAME from CTRL_EXT, reading ICR doesn't interfere with RxQ0, TxQ0 interrupts anymore. We handle the second part of the problem by not re-enabling the Other interrupt right away when there is overrun. Instead, we wait until traffic subsides, napi polling mode is exited and interrupts are re-enabled. Reported-by: Lennart Sorensen Fixes: 16ecba59bc33 ("e1000e: Do not read ICR in Other interrupt") Signed-off-by: Benjamin Poirier Tested-by: Aaron Brown Signed-off-by: Jeff Kirsher Signed-off-by: Amit Pundir --- drivers/net/ethernet/intel/e1000e/defines.h | 1 + drivers/net/ethernet/intel/e1000e/netdev.c | 33 ++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) -- 2.7.4 diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h index 0641c0098738..afb7ebe20b24 100644 --- a/drivers/net/ethernet/intel/e1000e/defines.h +++ b/drivers/net/ethernet/intel/e1000e/defines.h @@ -398,6 +398,7 @@ #define E1000_ICR_LSC 0x00000004 /* Link Status Change */ #define E1000_ICR_RXSEQ 0x00000008 /* Rx sequence error */ #define E1000_ICR_RXDMT0 0x00000010 /* Rx desc min. threshold (0) */ +#define E1000_ICR_RXO 0x00000040 /* Receiver Overrun */ #define E1000_ICR_RXT0 0x00000080 /* Rx timer intr (ring 0) */ #define E1000_ICR_ECCER 0x00400000 /* Uncorrectable ECC Error */ /* If this bit asserted, the driver should claim the interrupt */ diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 83071fe99323..99e5ef561f06 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -1910,14 +1910,30 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data) struct net_device *netdev = data; struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_hw *hw = &adapter->hw; + u32 icr; + bool enable = true; + + icr = er32(ICR); + if (icr & E1000_ICR_RXO) { + ew32(ICR, E1000_ICR_RXO); + enable = false; + /* napi poll will re-enable Other, make sure it runs */ + if (napi_schedule_prep(&adapter->napi)) { + adapter->total_rx_bytes = 0; + adapter->total_rx_packets = 0; + __napi_schedule(&adapter->napi); + } + } + if (icr & E1000_ICR_LSC) { + ew32(ICR, E1000_ICR_LSC); + hw->mac.get_link_status = true; + /* guard against interrupt when we're going down */ + if (!test_bit(__E1000_DOWN, &adapter->state)) + mod_timer(&adapter->watchdog_timer, jiffies + 1); + } - hw->mac.get_link_status = true; - - /* guard against interrupt when we're going down */ - if (!test_bit(__E1000_DOWN, &adapter->state)) { - mod_timer(&adapter->watchdog_timer, jiffies + 1); + if (enable && !test_bit(__E1000_DOWN, &adapter->state)) ew32(IMS, E1000_IMS_OTHER); - } return IRQ_HANDLED; } @@ -2687,7 +2703,8 @@ static int e1000e_poll(struct napi_struct *napi, int weight) napi_complete_done(napi, work_done); if (!test_bit(__E1000_DOWN, &adapter->state)) { if (adapter->msix_entries) - ew32(IMS, adapter->rx_ring->ims_val); + ew32(IMS, adapter->rx_ring->ims_val | + E1000_IMS_OTHER); else e1000_irq_enable(adapter); } @@ -4204,7 +4221,7 @@ static void e1000e_trigger_lsc(struct e1000_adapter *adapter) struct e1000_hw *hw = &adapter->hw; if (adapter->msix_entries) - ew32(ICS, E1000_ICS_OTHER); + ew32(ICS, E1000_ICS_LSC | E1000_ICS_OTHER); else ew32(ICS, E1000_ICS_LSC); }