From patchwork Thu Oct 15 14:55:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 3630 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id 9928F1C2277 for ; Thu, 15 Oct 2026 17:17:28 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=riscstar-com.20251104.gappssmtp.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-26672-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-26672-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id 81C3661CC0A for ; Thu, 15 Oct 2026 15:01:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 42E2653C3B3; Thu, 15 Oct 2026 14:58:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b="siNHpLFS" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A3FE3D6CC3 for ; Thu, 15 Oct 2026 14:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; cv=none; b=QYZS+BhP8ZBIk2fvwrP66ZZH3CTzMraz0h5bYL5AWx1gWu0i2adIdZCUh2dDrlp1tNbmhylqWoUJ03bor+xvVXSWy5frT8h6vOYUVjjq4Jsq0aecmrdE9h0dik8LgvDnH6R1YZmNdcbfopvo6h2I9vpsk8POJeECcweu1Z4oJbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; c=relaxed/simple; bh=Xmsh8vLkxa+urAg9ZzBey5HhQUknHpXB+xWvp5JB6io=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bksxxxltbbKoQKXtcNJgELc5VNMJB6B0MsKWaPPKZH+Eb6J1+t2wk3C3lUC9NNnj4saHZyXTnlNxa/RXKFhRIjJ6LsxaK1PpV2tg26E9tgVjYPG2GdM63+rapOkjilDztanAS+aAzbvzHffVFNpHvMbVb5xYZxUHKNkphHoMTNs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com; spf=pass smtp.mailfrom=riscstar.com; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b=siNHpLFS; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=riscstar.com Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-48c4be28b82so545134f8f.2 for ; Thu, 15 Oct 2026 07:58:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=riscstar-com.20251104.gappssmtp.com; s=20251104; t=1792076295; x=1792681095; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HM+R+mbJK8RLBqpDdx1wr25PKa74we7OacPAq9nMC0I=; b=siNHpLFSghf/vUoWdY4Q4k3sBp710oDzps63YP1TwKn5kKCBM1xx8xpz61SMfcubNE UWRI/msDfGVynwYIRQ8hVzOmUAO06zMCvsGxPNxmW7b64JoW1KopAWz37GVF11KgiyuG I/TrFYFSBchpInmSk4cfPqpEzT/xLUF5nxZMx8cg9G+BZAStoDX4b5nlyHIo4CB4Fm0S orPNyNBXqamOMhLNMTyLsfoOZZttHc9Tp3eaDLQR5lIg0bwzLBs3eFImK449/fW9fDKH 4a140OMkLCCs8McFwmC9PN5pO0jO7X5qb1AdBked1i8yg2vrZ1k+OAdGXkhFSuuIUrIv Ex9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792076295; x=1792681095; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HM+R+mbJK8RLBqpDdx1wr25PKa74we7OacPAq9nMC0I=; b=fEbUIOg7jpU59SFy8Cs26lqjvkFKvN6eCzBsCTYCACdHkXppjLy2uu/BEZu/Qmv5BV V7thGaCCshASqtuHPKYYmh6jK+QfdAo5FlNP1EtHPunPWqKuoVCvQR2NAYsUd6iKQH7U 7KwEwg+zC+iE5O6LAROK9Y62mug89TFNidBHYyPMN2aalxf934nMMnSBBLhMbDmvdJ1u Wbmi6WsRyoz7CDUsr4KJATtLzngL1odN9tLcEV9+VO1JteuIq7WvcccITccbI6I6IRVE yzOFJsjiNmFprchPMJdiPUofy7IURdcefYdQcn+v/xcsfiWAi9yRybaZMhs6XWUxGn2J Cqew== X-Forwarded-Encrypted: i=1; AKwUvBzZHWQml+kqWM9IbsOE+lx6SZ7oOnxIC+qF+osCbWpIac7CL9OC/xjmICrsGkzO836H8UK7wB+kiqb0xw==@lists.linux.dev X-Gm-Message-State: AFq9FYKNhKdEZ7S4YTuRfGzA5PGEdIKL0Wvxzlu7g4GcqoL0w8oVppVy Ka9aMsPN2WWp+mIcHhTZtyvfdEpvSRE+F6AD59fs3Ul1tt14uF/TzBWncfcXTX0RAzU= X-Gm-Gg: AYBFou0Mnp1Vv+nOy0v7apleOWHLSEqgDOtTq5I2bM2O/asMaawr2063AtoHxRtaQa7 7qkaz9wAaUMnFlOJQg4l55jsU7kT1Aw6mxOkWsNkfHC8yuZQZyh5sdwGaehbbyo/PfFTamsz9Wt pvKt3tf1vm3VwRxkKzrGRI7I1kceml5xr1EqW9krc4YvcfDt/kYbcUHKB+0Iqm1qRE4v4ObVcbM O2PScP8KKZGJVCgvOI9GVffuZIDoJNNK4v1GdNq4U7xkBYZYoazKQb1fuy2b+j2aYq1QMXBgYqv 2+TqJUjuPZaCeWrvXC+OwV/nUgneHQj3WMzDXIsNNLR5SADD6vf3djFQXSeIiHYcCNq/mAgkagN 2srGYu7aCJBxMhzTSH5I3yQPcCWudathgxQrv8a4tpL23gJFe9KjSrepPDUBEP39Vp58/JPuchS 8buQ3Db95+Bwm7VrJs08YgzBwaeuwxUZYDRIelzaOvyUgcqmSJ2r1SdktGMk6c234f/pAa+Qkng U+QdyWu8CuscizHEVVEJzuk5ttE/+bv+3Pvljy5J34CHevq2XqIAD0+/FOrWJxeOpAoJb/wpu8j dCbFwsrNIXthu9noT6mtU67JAzm9+t3KDIN8eku82Rmvn8BxfkjDHiNjZaQKccx1uok1Cw== X-Received: by 2002:a5d:43c4:0:b0:48d:ba3b:af36 with SMTP id ffacd0b85a97d-48dbaae8e33mr30543201f8f.37.1792076295196; Thu, 15 Oct 2026 07:58:15 -0700 (PDT) Received: from aspen.lan (aztw-33-b2-v4wan-169864-cust3247.vm26.cable.virginm.net. [92.239.204.176]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48de0ac4fd7sm19738293f8f.40.2026.10.15.07.58.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 07:58:14 -0700 (PDT) From: Daniel Thompson Date: Thu, 15 Oct 2026 15:55:02 +0100 Subject: [PATCH net-next v3 2/2] net: stmmac: Avoid freeing and re-requesting IRQ during XDP set prog Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20261015-tc956x-stmmac-no_irq_teardown-v3-2-8189870be545@riscstar.com> References: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> In-Reply-To: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> To: Andrew Lunn , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Maxime Chevallier , Eric Dumazet , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Eric Dumazet Cc: Alex Elder , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-sunxi@lists.linux.dev, Daniel Thompson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5397; i=daniel@riscstar.com; h=from:subject:message-id; bh=Xmsh8vLkxa+urAg9ZzBey5HhQUknHpXB+xWvp5JB6io=; b=owEBbQKS/ZANAwAKAXzjJV0594ihAcsmYgBq0On0886l08HHREvWrJqdn0hcWlbVy9OPSK05v 3jBqmxmICCJAjMEAAEKAB0WIQQvNUFTUPeVarpwrPB84yVdOfeIoQUCatDp9AAKCRB84yVdOfeI oVUJD/9PRRiCUW/mNpgCqony21Y+ly09GrfxL7uqhj8q7gbv3J7MfZzTgMES0M6JKRyOUTAWMbW mdRzY0OHRDgRt01w5WKjbMjHKriUKKfk40tc7BLkyYmI2DRz3uAYVE5e5Nh7GLXylUtF9z/QtF9 YjFgKjuhdfSknG+uoXjgTwASLwOAjFHoHdkgOE3Q+8akX0b99GZb+WRvbNxXVEnTrgBjd65cMvK U49YCfVG3Y4LkLOhZHNWRjs+NzvBvU0DqHF93X9cMQzzaFG47gaWbzwIcUEgsvTm5U0U+wbwLKS zFccajtkdEBVDGQdvdtLre3N+JRcuyEM///kbv4u/PgqFeTrcnpjiwuQXOaFHz4dX5fgRVGXSGM RxRl/xUENymJW+9VIdG4SDmIsKVrZ+K9K4smCGuki9lHJm2ev5j5ruLxN8ePCOZx+hhzi3ODiX7 sPkd0pIyACcYwhdR264p7xgILqRgTjje1USdjq+0TiVtd9hTSbIsW+/8BtC0JDxOBI1lfZwOtzW lPy/dGg/KH02/QaJYKzf0KIxxiVIk62+9KMYdt7JH9IIMY4HjVrq67ocMu09Fs+hB9V4u1+jusd TOBMZnXTwmhsWV+nTxj6CloIkRFtCsiUncePB8XlUuKBOBuFiF4iOzGL2Ip6bmD25BIV+jdKDSN +q/Y6jCTmK2tnHg== X-Developer-Key: i=daniel@riscstar.com; a=openpgp; fpr=E38BE19861669213F6E2661AA8A4E3BC5B7B28BE X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-1.16 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.232.135.74:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[riscstar.com : SPF not aligned (relaxed), No valid DKIM,none]; MAILLIST(-0.15)[generic]; BAD_REP_POLICIES(0.10)[]; MIME_GOOD(-0.10)[text/plain]; HAS_LIST_UNSUB(-0.01)[]; FROM_HAS_DN(0.00)[]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; PRECEDENCE_BULK(0.00)[]; TAGGED_RCPT(0.00)[netdev]; FORGED_SENDER_MAILLIST(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[riscstar.com:email,sto.lore.kernel.org:rdns,sto.lore.kernel.org:helo]; RCPT_COUNT_TWELVE(0.00)[25]; RCVD_COUNT_FIVE(0.00)[6]; ASN(0.00)[asn:63949, ipnet:172.232.128.0/19, country:SG]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(0.00)[+ip4:172.232.135.74]; RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[92.239.204.176:received,100.90.174.1:received,209.85.221.46:received]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[172.232.135.74:from]; FROM_NEQ_ENVFROM(0.00)[daniel@riscstar.com,linux-sunxi@lists.linux.dev]; FREEMAIL_TO(0.00)[lunn.ch,davemloft.net,kernel.org,redhat.com,gmail.com,foss.st.com,iogearbox.net,fomichev.me,bootlin.com,sholland.org]; MIME_TRACE(0.00)[0:+]; TAGGED_FROM(0.00)[bounces-26672-noreply=patchwork.local]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_TLS_LAST(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: 9928F1C2277 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Currently stmmac will run a full cycle of IRQ tear down and setup when setting up a new XDP program. This makes tuning TSN systems difficult because whenever a new XDP program is installed then the irq threads will be stopped and restarted which will undo any thread tuning. The problem is avoided by removing stmmac_free_irq()/stmmac_request_irq() from stmmac_xdp_release()/stmmac_xdp_open(). stmmac_free_irq() implicitly synchronizes interrupts and, with that removed, nothing else disables interrupts or makes later actions by stmmac_xdp_release() safe when there are concurrent interrupts. Thus we must replace the code to free the IRQ with code to disable (and sync) DMA interrupts. We also need to avoid re-initializing the DMA channel. Happily the reinit is redundant, it is sufficient to rely on the re-enabling of interrupts at the end of stmmac_xdp_open(). Signed-off-by: Daniel Thompson --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 65 +++++++++++++++++------ 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 7b80fe66cf199adbd31b79a484b2970aef211b51..f1359637007e211b505dd74577232cdc079baf46 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -144,6 +144,7 @@ static const char *stmmac_dwxgmac_phyif[4] = { [PHY_INTF_RGMII] = "RGMII", }; +static void stmmac_synchronize_irq(struct net_device *dev); static irqreturn_t stmmac_interrupt(int irq, void *dev_id); /* For MSI interrupts handling */ static irqreturn_t stmmac_mac_interrupt(int irq, void *dev_id); @@ -2520,6 +2521,23 @@ static void stmmac_enable_all_dma_irq(struct stmmac_priv *priv) } } +static void stmmac_disable_all_dma_irq(struct stmmac_priv *priv) +{ + u8 rx_channels_count = priv->plat->rx_queues_to_use; + u8 tx_channels_count = priv->plat->tx_queues_to_use; + u8 dma_csr_ch = max(rx_channels_count, tx_channels_count); + u8 chan; + + for (chan = 0; chan < dma_csr_ch; chan++) { + struct stmmac_channel *ch = &priv->channel[chan]; + unsigned long flags; + + spin_lock_irqsave(&ch->lock, flags); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_ALL); + spin_unlock_irqrestore(&ch->lock, flags); + } +} + /** * stmmac_start_all_dma - start all RX and TX DMA channels * @priv: driver private structure @@ -3816,6 +3834,33 @@ static void stmmac_free_irq(struct net_device *dev, } } +static void stmmac_synchronize_irq(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + struct stmmac_msi *msi = priv->msi; + int j; + + for (j = priv->plat->tx_queues_to_use - 1; msi && j >= 0; j--) { + if (msi->tx_irq[j] > 0) + synchronize_irq(msi->tx_irq[j]); + } + + for (j = priv->plat->rx_queues_to_use - 1; msi && j >= 0; j--) { + if (msi->rx_irq[j] > 0) + synchronize_irq(msi->rx_irq[j]); + } + + if (msi && msi->sfty_ue_irq > 0 && msi->sfty_ue_irq != dev->irq) + synchronize_irq(msi->sfty_ue_irq); + if (msi && msi->sfty_ce_irq > 0 && msi->sfty_ce_irq != dev->irq) + synchronize_irq(msi->sfty_ce_irq); + if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) + synchronize_irq(priv->wol_irq); + if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) + synchronize_irq(priv->sfty_irq); + synchronize_irq(dev->irq); +} + static int stmmac_msi_init(struct stmmac_priv *priv, struct stmmac_resources *res) { @@ -7141,8 +7186,9 @@ void stmmac_xdp_release(struct net_device *dev) for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); - /* Free the IRQ lines */ - stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0); + /* Silence DMA interrupts */ + stmmac_disable_all_dma_irq(priv); + stmmac_synchronize_irq(dev); /* Stop TX/RX DMA channels */ stmmac_stop_all_dma(priv); @@ -7165,7 +7211,6 @@ int stmmac_xdp_open(struct net_device *dev) struct stmmac_priv *priv = netdev_priv(dev); u8 rx_cnt = priv->plat->rx_queues_to_use; u8 tx_cnt = priv->plat->tx_queues_to_use; - u8 dma_csr_ch = max(rx_cnt, tx_cnt); struct stmmac_rx_queue *rx_q; struct stmmac_tx_queue *tx_q; bool sph_en; @@ -7188,12 +7233,6 @@ int stmmac_xdp_open(struct net_device *dev) stmmac_reset_queues_param(priv); - /* DMA CSR Channel configuration */ - for (chan = 0; chan < dma_csr_ch; chan++) { - stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX); - } - /* Adjust Split header */ sph_en = (priv->hw->rx_csum > 0) && priv->sph_active; @@ -7230,10 +7269,6 @@ int stmmac_xdp_open(struct net_device *dev) /* Start Rx & Tx DMA Channels */ stmmac_start_all_dma(priv); - ret = stmmac_request_irq(dev); - if (ret) - goto irq_error; - /* Enable NAPI process*/ stmmac_enable_all_queues(priv); netif_carrier_on(dev); @@ -7242,10 +7277,6 @@ int stmmac_xdp_open(struct net_device *dev) return 0; -irq_error: - for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) - hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); - init_error: free_dma_desc_resources(priv, &priv->dma_conf); dma_desc_error: