From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oo2-f42.google.com (mail-oo2-f42.google.com [74.125.231.170]) (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 73A9644AB99 for ; Sun, 27 Sep 2026 22:00:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790546432; cv=none; b=Nscg8m+/iwgxFWip0Yxz6JFUcOX+LsFYWpw8ehv6VZ6jenhdyzbOQJzVpCi2fSEcZOfPg9pjonHheEDhLkFWdQC+7DwVJUW5+7tx2s2wTKSybicAUpjlsPU2JaNh2C8ktuuirQmjtNCNFKV2zubIH4iW4Z/q2OxHselYMTIB/dA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790546432; c=relaxed/simple; bh=e8Ab0vluYWvd/r+l2hGFayg0mumuN73e2IRX1RnFQco=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MixOOn94fHYi29snXN9L1J9RzKBJVi4rwaXBqtPCB6sNWvDe6SyExo7IlPURmGr/lAe3RA5d/MdxBFScMNYFsITXV403IMdDF4HhPVYN3CFByG3CMqKXA0DMR7tcm38aeyMW1dtGaJtPQw21T3JXdtMCOAeq7kzNmRlrPYsi4pg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CG08PVIo; arc=none smtp.client-ip=74.125.231.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CG08PVIo" Received: by mail-oo2-f42.google.com with SMTP id 006d021491bc7-6d817a94747so321833eaf.3 for ; Sun, 27 Sep 2026 15:00:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790546423; x=1791151223; darn=vger.kernel.org; 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=AO44ZR+1vB6Jmo6A0lloXr+b5M9npc7CCaZmTVxm41A=; b=CG08PVIoRTGvmcnktHMbhLBzuoqi8DqDmajYzq2YcfnUlzYEoj0U9NVAQWXevvnAsm +Gl+BixHfCz9ULFKwPvfYmFMixFalOgkyxmJNDenyV2uUNMR1+ziHw2dL1GzxG3uR+7O MbU9j9Grh+YyDYZQ/K/WjjroOs87S4wCcDu0ZX4+Ptlzcn3Ayrnab4ogtX8cVEO5SAJ6 VX8NGiwJq/twD6IIa2BYE6tTCXLb4ObcDvFVSUcI4J80TINuJo4M4ev0x3u9wUv4Uyc6 0H9gjdVGIEYKqF85eItYgoONmxvpid8b8ZczJQOqKeknYTVjFmYPf7wbKWG25Qd0ZR52 gszQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790546423; x=1791151223; 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=AO44ZR+1vB6Jmo6A0lloXr+b5M9npc7CCaZmTVxm41A=; b=cdGmR4dvAdhj+G3gAdCwQGaPVctisMStAJzd+KnxK8YMYdPJdd2weCiJUSNj4fj+8W BjEsDTtJe7wHg0BHxVjkMmqBFpAW49ZuKpxM2GqdaRXB/7WY314luynVS7cIz3IAD+FJ 7gonmTd17gXmIuXF2BEs2KsRdPEfKcw5veahiclZBJ1Yqd2hhHS866DhtiwGton0+5// rMr+mwAJty4+RRPR8OIXa6fCgkbz6MWEyF+KFngFlSIKJhj+0+IjA7idnWjIs9gDL85S ymoW5VJUsuAWfewmsOhDp3jHDG9qjpVIXDd+Q3TfzK5udDvgmv6tXDsCJJMhP6I0F1iF BL8A== X-Forwarded-Encrypted: i=1; AKwUvByEe/WF9Vj6goFGJaL/7QoXXp9kGVdygOzdMkPFRxQksqAfVn11MFQ7u9iUt+eILKcrfMHa91g3IbuDt9g=@vger.kernel.org X-Gm-Message-State: AFuF++nhCJRUbjYPiRAhKHuvsEM03liqIx7MQrk47ADSj2fw38Ed+nRW Q7g4+eSZhmj0I17OR24ci3rwB6Hpf/ELyjuphDik9JK0rfLZHpc6ZAZW X-Gm-Gg: AYBFou0GvpPtYTCXuxTm+cI5+KVbZ8K1YHflwLereq6FdJzB7fiMJ0lNjScjXii83wI 7Tthtn75M1Wokl6SCNWqbBix7fUBbHAoeNl2sAPbgHoWu/DeS377lhy0X/nEJn+8wKCvj8ngMvc kHZSh6xFNxjluG8dSH16sya5RDx04R5NUzFmiicTUSDd2X1Ilvf+vhbVim8123PGQr8jAUcoB4z O8sY8omI1lmoZm0rsMaJxqYRY7STYREzxlbWKKveISEVnC3eQ35qdgYjdIMfnkEwKZs+bfeTJMk eYTcDpa+1kxl/QdOUY31gVoI8tUEoW/D6XCSLpSVpti6MkWS+Rq3upHZjEruVxx9tmQZHKp3o9G DDf1RPYyY3IFTWPGGC1XMTa0A80WFCrBB8Xhkj7LMak0AbKwHnViobPKHjsAF3F9oHJ5lKQwGTh SyfOy5wNU1A2rtt9OoUwhQaRhrORpV1JKRrRcrU0vX1dIvXNCQ1sQ0+fzEFh9WT5qhWxepL9uWc Xo7HmHbus49JjS+XKfU91bb3zU/A1Sd1sGLv2JszsrATt6VoSeDizSxGMCl3SB9w49xlpPEdlzy ZitmF4BcRalJms21FDPfyDPavPWJB04WGSsqJ0pyfrrs3oBBhkfV3T7l7HmhZYFXp4w7tkaTyey nMVPqpchWChsTDghnzcTl X-Received: by 2002:a05:6820:827:b0:6b3:f4b8:bb86 with SMTP id 006d021491bc7-6d43f4bd3c4mr10875034eaf.22.1790546423202; Sun, 27 Sep 2026 15:00:23 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-81b3de6f7e1sm4874147a34.22.2026.09.27.15.00.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 15:00:22 -0700 (PDT) From: James Hilliard Date: Sun, 27 Sep 2026 15:59:49 -0600 Subject: [PATCH net-next v5 14/19] net: stmmac: use the tracked datapath restart for XSK pool changes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260927-submit-stmmac-reset-fixes-v1-v5-14-feec6c14dd06@gmail.com> References: <20260927-submit-stmmac-reset-fixes-v1-v5-0-feec6c14dd06@gmail.com> In-Reply-To: <20260927-submit-stmmac-reset-fixes-v1-v5-0-feec6c14dd06@gmail.com> To: Russell King , Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Russell King (Oracle)" , Maxime Chevallier , Andrew Lunn , Maxime Coquelin , Alexandre Torgue , Christian Marangi , Tiezhu Yang , Huacai Chen , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Serge Semin , Suraj Jaiswal , Richard Cochran , Joao Pinto , Vladimir Oltean , Ong Boon Leong , Voon Weifeng , "Song, Yoong Siang" , Linus Walleij , Martin Blumenstingl , Magnus Karlsson , Maciej Fijalkowski , Simon Horman , =?utf-8?q?Bj=C3=B6rn_T=C3=B6pel?= , Thierry Reding , Jonathan Hunter , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Jose Abreu , Yao Zi , Philipp Zabel Cc: Richard Genoud , Alastair D'Silva , Maxime Ripard , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, bpf@vger.kernel.org, ZhaoJinming , Lorenzo Bianconi , Ding Hui , Linkui Xiao , Linkui Xiao , linux-tegra@vger.kernel.org, linux-sunxi@lists.linux.dev, James Hilliard X-Mailer: b4 0.15.2 Replace the void per-queue enable helpers with the tracked XDP restart. Pause all queues and MAC link resolution while the pool bitmap and rings change, leaving the PHY running through phylink replay. Unwind a failed pool attachment without leaving NAPI over missing buffers. Pool removal must complete even if ordinary-ring rebuilding fails, after retiring all references to the departing pool. Preserve TBS configuration and return a detached interface to the ordinary down/up recovery path. Fixes: bba2556efad6 ("net: stmmac: Enable RX via AF_XDP zero-copy") Signed-off-by: James Hilliard --- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 5 - drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 116 +++------------------- drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c | 44 ++++---- 3 files changed, 32 insertions(+), 133 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 6927afd01175..38370f2cbe87 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -473,11 +473,6 @@ static inline bool stmmac_tc_active(struct stmmac_priv *priv) netif_device_present(priv->dev) && !priv->hw_unavailable; } -void stmmac_disable_rx_queue(struct stmmac_priv *priv, u32 queue); -void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue); -void stmmac_disable_tx_queue(struct stmmac_priv *priv, u32 queue); -void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue); -int stmmac_xsk_wakeup(struct net_device *dev, u32 queue, u32 flags); struct timespec64 stmmac_calc_tas_basetime(ktime_t old_base_time, ktime_t current_time, u64 cycle_time); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index ad5ed2c95af7..95757f3cbc64 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2318,6 +2318,7 @@ static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, kfree(tx_q->tx_skbuff); tx_q->tx_skbuff = NULL; + tx_q->xsk_pool = NULL; } static void free_dma_tx_desc_resources(struct stmmac_priv *priv, @@ -2830,6 +2831,12 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget) bool work_done = true; u32 tx_set_ic_bit = 0; + /* Nothing can be submitted while the link is down. Let NAPI complete; + * userspace can retry ndo_xsk_wakeup() once carrier has returned. + */ + if (!netif_carrier_ok(priv->dev)) + return true; + /* Avoids TX time-out as we are sharing with slow path */ txq_trans_cond_update(nq); @@ -2844,8 +2851,7 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget) /* We are sharing with slow path and stop XSK TX desc submission when * available TX ring is less than threshold. */ - if (unlikely(stmmac_tx_avail(priv, queue) < STMMAC_TX_XSK_AVAIL) || - !netif_carrier_ok(priv->dev)) { + if (unlikely(stmmac_tx_avail(priv, queue) < STMMAC_TX_XSK_AVAIL)) { work_done = false; break; } @@ -7450,107 +7456,6 @@ static int stmmac_xdp_xmit(struct net_device *dev, int num_frames, return nxmit; } -void stmmac_disable_rx_queue(struct stmmac_priv *priv, u32 queue) -{ - struct stmmac_channel *ch = &priv->channel[queue]; - unsigned long flags; - - spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 1, 0); - spin_unlock_irqrestore(&ch->lock, flags); - - stmmac_stop_rx_dma(priv, queue); - __free_dma_rx_desc_resources(priv, priv->dma_conf, queue); -} - -void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue) -{ - struct stmmac_rx_queue *rx_q = &priv->dma_conf->rx_queue[queue]; - struct stmmac_channel *ch = &priv->channel[queue]; - unsigned long flags; - int ret; - - ret = __alloc_dma_rx_desc_resources(priv, priv->dma_conf, queue); - if (ret) { - netdev_err(priv->dev, "Failed to alloc RX desc.\n"); - return; - } - - ret = __init_dma_rx_desc_rings(priv, priv->dma_conf, queue, GFP_KERNEL); - if (ret) { - __free_dma_rx_desc_resources(priv, priv->dma_conf, queue); - netdev_err(priv->dev, "Failed to init RX desc.\n"); - return; - } - - stmmac_reset_rx_queue(priv, queue); - stmmac_clear_rx_descriptors(priv, priv->dma_conf, queue); - - stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, - rx_q->dma_rx_phy, queue); - - stmmac_set_queue_rx_tail_ptr(priv, rx_q, queue, rx_q->buf_alloc_num); - - stmmac_set_queue_rx_buf_size(priv, rx_q, queue); - - stmmac_start_rx_dma(priv, queue); - - spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 1, 0); - spin_unlock_irqrestore(&ch->lock, flags); -} - -void stmmac_disable_tx_queue(struct stmmac_priv *priv, u32 queue) -{ - struct stmmac_channel *ch = &priv->channel[queue]; - unsigned long flags; - - spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 0, 1); - spin_unlock_irqrestore(&ch->lock, flags); - - stmmac_stop_tx_dma(priv, queue); - __free_dma_tx_desc_resources(priv, priv->dma_conf, queue); -} - -void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue) -{ - struct stmmac_tx_queue *tx_q = &priv->dma_conf->tx_queue[queue]; - struct stmmac_channel *ch = &priv->channel[queue]; - unsigned long flags; - int ret; - - ret = __alloc_dma_tx_desc_resources(priv, priv->dma_conf, queue); - if (ret) { - netdev_err(priv->dev, "Failed to alloc TX desc.\n"); - return; - } - - ret = __init_dma_tx_desc_rings(priv, priv->dma_conf, queue); - if (ret) { - __free_dma_tx_desc_resources(priv, priv->dma_conf, queue); - netdev_err(priv->dev, "Failed to init TX desc.\n"); - return; - } - - stmmac_reset_tx_queue(priv, queue); - stmmac_clear_tx_descriptors(priv, priv->dma_conf, queue); - - stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, - tx_q->dma_tx_phy, queue); - - if (tx_q->tbs & STMMAC_TBS_AVAIL) - stmmac_enable_tbs(priv, priv->ioaddr, 1, queue); - - stmmac_set_queue_tx_tail_ptr(priv, tx_q, queue, 0); - - stmmac_start_tx_dma(priv, queue); - - spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 0, 1); - spin_unlock_irqrestore(&ch->lock, flags); -} - void stmmac_xdp_release(struct net_device *dev) { struct stmmac_priv *priv = netdev_priv(dev); @@ -7650,6 +7555,9 @@ int stmmac_xdp_open(struct net_device *dev) stmmac_set_queue_tx_tail_ptr(priv, tx_q, chan, 0); + if (tx_q->tbs & STMMAC_TBS_AVAIL) + stmmac_enable_tbs(priv, priv->ioaddr, 1, chan); + hrtimer_setup(&tx_q->txtimer, stmmac_tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); } @@ -7687,7 +7595,7 @@ int stmmac_xdp_open(struct net_device *dev) return ret; } -int stmmac_xsk_wakeup(struct net_device *dev, u32 queue, u32 flags) +static int stmmac_xsk_wakeup(struct net_device *dev, u32 queue, u32 flags) { struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_channel *ch; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c index 7ecb7addd2ea..907ac49a1b76 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c @@ -9,7 +9,6 @@ static int stmmac_xdp_enable_pool(struct stmmac_priv *priv, struct xsk_buff_pool *pool, u16 queue) { - struct stmmac_channel *ch = &priv->channel[queue]; bool need_update; u32 frame_size; int err; @@ -34,23 +33,23 @@ static int stmmac_xdp_enable_pool(struct stmmac_priv *priv, need_update = priv->datapath == STMMAC_DATAPATH_RUNNING && stmmac_xdp_is_enabled(priv); - if (need_update) { - napi_disable(&ch->rx_napi); - napi_disable(&ch->tx_napi); - stmmac_disable_rx_queue(priv, queue); - stmmac_disable_tx_queue(priv, queue); - } + if (need_update) + stmmac_xdp_release(priv->dev); set_bit(queue, priv->af_xdp_zc_qps); if (need_update) { - stmmac_enable_rx_queue(priv, queue); - stmmac_enable_tx_queue(priv, queue); - napi_enable(&ch->rxtx_napi); - - err = stmmac_xsk_wakeup(priv->dev, queue, XDP_WAKEUP_RX); - if (err) + err = stmmac_xdp_open(priv->dev); + if (err) { + clear_bit(queue, priv->af_xdp_zc_qps); + xsk_pool_dma_unmap(pool, STMMAC_RX_DMA_ATTR); + netdev_err(priv->dev, "failed reopening after XSK pool attach: %pe; interface remains detached\n", + ERR_PTR(err)); return err; + } + + /* The pool is installed even if link resolution is still pending. */ + napi_schedule(&priv->channel[queue].rxtx_napi); } return 0; @@ -58,9 +57,9 @@ static int stmmac_xdp_enable_pool(struct stmmac_priv *priv, static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue) { - struct stmmac_channel *ch = &priv->channel[queue]; struct xsk_buff_pool *pool; bool need_update; + int err; if (queue >= priv->plat->rx_queues_to_use || queue >= priv->plat->tx_queues_to_use) @@ -73,24 +72,21 @@ static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue) need_update = priv->datapath == STMMAC_DATAPATH_RUNNING && stmmac_xdp_is_enabled(priv); - if (need_update) { - napi_disable(&ch->rxtx_napi); - stmmac_disable_rx_queue(priv, queue); - stmmac_disable_tx_queue(priv, queue); - synchronize_rcu(); - } + if (need_update) + stmmac_xdp_release(priv->dev); xsk_pool_dma_unmap(pool, STMMAC_RX_DMA_ATTR); clear_bit(queue, priv->af_xdp_zc_qps); if (need_update) { - stmmac_enable_rx_queue(priv, queue); - stmmac_enable_tx_queue(priv, queue); - napi_enable(&ch->rx_napi); - napi_enable(&ch->tx_napi); + err = stmmac_xdp_open(priv->dev); + if (err) + netdev_err(priv->dev, "failed reopening after XSK pool removal: %pe; interface remains detached\n", + ERR_PTR(err)); } + /* Socket teardown must be able to unmap and free the removed pool. */ return 0; } -- 2.53.0