From patchwork Wed Dec 6 17:24:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Stach X-Patchwork-Id: 845265 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ysQV91mX6z9ryT for ; Thu, 7 Dec 2017 04:25:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752050AbdLFRZD (ORCPT ); Wed, 6 Dec 2017 12:25:03 -0500 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:59257 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751680AbdLFRZB (ORCPT ); Wed, 6 Dec 2017 12:25:01 -0500 Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7] helo=dude.pengutronix.de.) by metis.ext.pengutronix.de with esmtp (Exim 4.84_2) (envelope-from ) id 1eMdRL-0003Fb-Rz; Wed, 06 Dec 2017 18:24:59 +0100 From: Lucas Stach To: Fugang Duan , netdev@vger.kernel.org Cc: patchwork-lst@pengutronix.de, kernel@pengutronix.de Subject: [PATCH 1/2] net: fec: don't ack masked interrupt events Date: Wed, 6 Dec 2017 18:24:58 +0100 Message-Id: <20171206172459.14059-1-l.stach@pengutronix.de> X-Mailer: git-send-email 2.11.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The FEC doesn't have a real interrupt status register, that takes into account the mask status of the IRQ. The driver reads the raw interrupt event register, which also reports events for masked IRQs. The driver needs to apply the current mask itself, to avoid acking IRQs that are currently masked, as NAPI relies on the masking to hide the IRQs. The current behavior of just acking all interrupts regardless of their mask status opens the driver up the "rotting packet" race-window, as described in the original NAPI-HOWTO, which has been observed in the wild. Signed-off-by: Lucas Stach --- drivers/net/ethernet/freescale/fec_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 610573855213..0b70c07eb703 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1584,7 +1584,8 @@ fec_enet_interrupt(int irq, void *dev_id) uint int_events; irqreturn_t ret = IRQ_NONE; - int_events = readl(fep->hwp + FEC_IEVENT); + int_events = readl_relaxed(fep->hwp + FEC_IEVENT) & + readl_relaxed(fep->hwp + FEC_IMASK); writel(int_events, fep->hwp + FEC_IEVENT); fec_enet_collect_events(fep, int_events); From patchwork Wed Dec 6 17:24:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Stach X-Patchwork-Id: 845266 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ysQVD6bFKz9s7v for ; Thu, 7 Dec 2017 04:25:08 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751950AbdLFRZC (ORCPT ); Wed, 6 Dec 2017 12:25:02 -0500 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:54909 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751570AbdLFRZB (ORCPT ); Wed, 6 Dec 2017 12:25:01 -0500 Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7] helo=dude.pengutronix.de.) by metis.ext.pengutronix.de with esmtp (Exim 4.84_2) (envelope-from ) id 1eMdRL-0003Fb-Tw; Wed, 06 Dec 2017 18:24:59 +0100 From: Lucas Stach To: Fugang Duan , netdev@vger.kernel.org Cc: patchwork-lst@pengutronix.de, kernel@pengutronix.de Subject: [PATCH 2/2] net: fec: optimize IRQ handler Date: Wed, 6 Dec 2017 18:24:59 +0100 Message-Id: <20171206172459.14059-2-l.stach@pengutronix.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171206172459.14059-1-l.stach@pengutronix.de> References: <20171206172459.14059-1-l.stach@pengutronix.de> X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org fep->work_rx and fep->work_tx are both non-zero, as long as the NAPI softirq hasn't finished its work. So if the current IRQ does not signal any RX or TX completion, but some unrelated event, the path to schedule the NAPI context is still entered. The handler works correctly as in this case napi_schedule_prep() will reject the scheduling attempt, but the flow can still be optimized by not trying to schedule if the IRQ doesn't signal RX or TX completion. Signed-off-by: Lucas Stach Acked-by: Fugang Duan --- drivers/net/ethernet/freescale/fec_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 0b70c07eb703..2043e140e9bd 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1587,14 +1587,14 @@ fec_enet_interrupt(int irq, void *dev_id) int_events = readl_relaxed(fep->hwp + FEC_IEVENT) & readl_relaxed(fep->hwp + FEC_IMASK); writel(int_events, fep->hwp + FEC_IEVENT); - fec_enet_collect_events(fep, int_events); - if ((fep->work_tx || fep->work_rx) && fep->link) { + if ((int_events & (FEC_ENET_RXF | FEC_ENET_TXF)) && fep->link) { ret = IRQ_HANDLED; if (napi_schedule_prep(&fep->napi)) { /* Disable the NAPI interrupts */ writel(FEC_NAPI_IMASK, fep->hwp + FEC_IMASK); + fec_enet_collect_events(fep, int_events); __napi_schedule(&fep->napi); } }