From nobody Sun Jun 28 00:10:22 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF9B5C433F5 for ; Thu, 17 Feb 2022 14:55:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242279AbiBQO4H (ORCPT ); Thu, 17 Feb 2022 09:56:07 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:38138 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242358AbiBQO4A (ORCPT ); Thu, 17 Feb 2022 09:56:00 -0500 Received: from smtp1.axis.com (smtp1.axis.com [195.60.68.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1EC0A1F5C85 for ; Thu, 17 Feb 2022 06:55:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axis.com; q=dns/txt; s=axis-central1; t=1645109745; x=1676645745; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=QxcUKmOttRZJLYW7ut8tqGGUV1itp+JVUMIR7K85mzc=; b=jvv+jTDVF9h6DWdFXBmrX1q6HMAK1xT36jfBm3N2qS7NYhdrAxq6SRGJ A6d80jwHcTrxYT/zGLAVAL1sP5mSRd6v64B8NZvV2HZdUvg4VeaNojGN0 pYRBen1uVHuxpQf+7dIaEleVwBpgzZso5cdODiutm9iWwnRG7zyLv2gx+ UAQfSaua91MyG82mxMtCT1LDSYLl8iShtlzs3uHFXb/IXDcsTCf1zbM+r xIEJQ9oVrv9NjRbbVlbLWRzRIncKTIBsSqsGM5jPz5s17IapMABjbB9Dr LTY9rg1MfPalKf5tAFc1MTg90OgJ7Nbs12tNa2fGAgIZwd0kjPC85tAGE w==; From: Vincent Whitchurch To: Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , "David S. Miller" , Jakub Kicinski , Maxime Coquelin CC: , Lars Persson , Vincent Whitchurch , Srinivas Kandagatla , , , , Subject: [PATCH] net: stmmac: Enable NAPI before interrupts go live Date: Thu, 17 Feb 2022 15:55:26 +0100 Message-ID: <20220217145527.2696444-1-vincent.whitchurch@axis.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Lars Persson The stmmac_open function has a race window between enabling the RX path and its interrupt to the point where napi_enabled is called. A chatty network with plenty of broadcast/multicast traffic has the potential to completely fill the RX ring before the interrupt handler is installed. In this scenario the single interrupt taken will find napi disabled and the RX ring will not be processed. No further RX interrupt will be delivered because the ring is full. The RX stall could eventually clear because the TX path will trigger a DMA interrupt once the tx_coal_frames threshold is reached and then NAPI becomes scheduled. Fixes: 523f11b5d4fd72efb ("net: stmmac: move hardware setup for stmmac_open= to new function") Signed-off-by: Lars Persson [vincent.whitchurch@axis.com: Forward-port to mainline, change xdp_open too] Signed-off-by: Vincent Whitchurch --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/ne= t/ethernet/stmicro/stmmac/stmmac_main.c index 6708ca2aa4f7..8bd4123515b0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3753,11 +3753,12 @@ static int stmmac_open(struct net_device *dev) /* We may have called phylink_speed_down before */ phylink_speed_up(priv->phylink); =20 + stmmac_enable_all_queues(priv); + ret =3D stmmac_request_irq(dev); if (ret) goto irq_error; =20 - stmmac_enable_all_queues(priv); netif_tx_start_all_queues(priv->dev); =20 return 0; @@ -3768,6 +3769,7 @@ static int stmmac_open(struct net_device *dev) for (chan =3D 0; chan < priv->plat->tx_queues_to_use; chan++) hrtimer_cancel(&priv->tx_queue[chan].txtimer); =20 + stmmac_disable_all_queues(priv); stmmac_hw_teardown(dev); init_error: free_dma_desc_resources(priv); @@ -6562,12 +6564,13 @@ int stmmac_xdp_open(struct net_device *dev) /* Start Rx & Tx DMA Channels */ stmmac_start_all_dma(priv); =20 + /* Enable NAPI process*/ + stmmac_enable_all_queues(priv); + ret =3D stmmac_request_irq(dev); if (ret) goto irq_error; =20 - /* Enable NAPI process*/ - stmmac_enable_all_queues(priv); netif_carrier_on(dev); netif_tx_start_all_queues(dev); =20 @@ -6577,6 +6580,7 @@ int stmmac_xdp_open(struct net_device *dev) for (chan =3D 0; chan < priv->plat->tx_queues_to_use; chan++) hrtimer_cancel(&priv->tx_queue[chan].txtimer); =20 + stmmac_disable_all_queues(priv); stmmac_hw_teardown(dev); init_error: free_dma_desc_resources(priv); --=20 2.34.1