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);