From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
To: Ding Hui <dinghui1111@163.com>
Cc: Maxime Chevallier <maxime.chevallier@bootlin.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@kernel.org>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Maxime Coquelin <mcoquelin.stm32@gmail.com>,
Alexandre Torgue <alexandre.torgue@foss.st.com>,
"open list:STMMAC ETHERNET DRIVER" <netdev@vger.kernel.org>,
"moderated list:ARM/STM32 ARCHITECTURE"
<linux-stm32@st-md-mailman.stormreply.com>,
"moderated list:ARM/STM32 ARCHITECTURE"
<linux-arm-kernel@lists.infradead.org>,
open list <linux-kernel@vger.kernel.org>,
dinghui@lixiang.com, xiasanbo@lixiang.com,
yangchen11@lixiang.com, liuxuanjun@lixiang.com,
biju.das.jz@bp.renesas.com, tomm.merciai@gmail.com
Subject: Re: [PATCH net v6 0/4] net: stmmac: fix RX descriptors and XSK TX on resume
Date: Thu, 12 Nov 2026 17:38:17 +0100 [thread overview]
Message-ID: <avXreY2EBUuQ2gpU@tom-desktop> (raw)
In-Reply-To: <cover.1794311618.git.dinghui@lixiang.com>
Hi Ding Hui,
Thanks for your series.
On Tue, Nov 10, 2026 at 08:38:51PM +0800, Ding Hui wrote:
> From: Ding Hui <dinghui@lixiang.com>
>
> This series restores RX descriptor addresses overwritten by hardware
> writeback between disabling NAPI and stopping RX DMA during suspend. It
> also fixes an AF_XDP TX-only resume stall found while testing the series.
>
> Patch 1 honors RX allocation flags. Patch 2 keeps unfilled XSK slots
> CPU-owned and tracks pending refills explicitly, including an empty ring
> and short refills. Patch 3 restores RX addresses from retained buffers,
> rebuilds chain pointers and initializes descriptor control fields. It
> publishes a contiguous XSK prefix and recomputes the tail and pending
> region. Patch 4 restores the bound XSK TX pool after TX buffer cleanup;
> otherwise zero-copy transmission can stop after resume.
>
> The earlier commit 9c63faaa931e ("net: stmmac: re-init rx buffers when mac
> resume back") was reverted by 00423969d806 after a Jetson TX2 suspend/resume
> regression. This series retains existing buffers and DMA mappings instead
> of recycling and reallocating every buffer. Jetson TX2 has not been tested.
>
> Hardware validation used backports on our XGMAC platform with a vendor
> kernel based on Linux 6.12.41, not these upstream commits as-is:
> - Receiving iperf traffic from a PC while suspending and resuming caused a
> fatal bus error after resume in almost every run without the RX fix.
> The same test no longer showed that failure with the fix.
I'm testing this series on the Renesas RZ/G3E.
On my setup I'm receiving iperf traffic from a PC while suspending and
resuming (s2idle):
[ 46.745703] renesas-gbeth 15c30000.ethernet end0: Link is Up - 100Mbps/Full - flow control rx/tx
Before this patch I'm seeing (during resume phase):
[ 73.919151] rzv2h-icu: BUS error k=1 status=0x00000040
Which I don't see anymore applying your series.
But after some suspend/resume cycle I'm seeing the following:
[ 262.878939] PM: suspend entry (s2idle)
[ 262.883075] Filesystems sync: 0.000 seconds
[ 262.888229] Freezing user space processes
[ 262.894080] Freezing user space processes completed (elapsed 0.001 seconds)
[ 262.901046] OOM killer disabled.
[ 262.904275] Freezing remaining freezable tasks
[ 262.910033] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
[ 262.974153] renesas-gbeth 15c30000.ethernet end0: Link is Down
[ 263.183095] SError Interrupt on CPU3, code 0x00000000be000011 -- SError
[ 263.183154] CPU: 3 UID: 0 PID: 0 Comm: swapper/3 Tainted: G M 7.4.0-rc2-00101-g8c75c70989f1 #6 PREEMPT(full)
[ 263.183204] Tainted: [M]=MACHINE_CHECK
[ 263.183217] Hardware name: Renesas SMARC EVK version 2 based on r9a09g047e57 (DT)
[ 263.183235] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 263.183271] pc : stmmac_tx_timer_arm+0x60/0xa4
[ 263.183333] lr : stmmac_xmit+0xd4c/0x1650
[ 263.183383] sp : ffff8000834435b0
[ 263.183396] x29: ffff8000834435b0 x28: ffff0000c0298ac0 x27: ffff0000c1498ce0
[ 263.183454] x26: 0000000000000001 x25: 00000000000021c0 x24: 0000000000000001
[ 263.183501] x23: ffff0000c0298cc0 x22: 0000000000000280 x21: 000000000000010e
[ 263.183549] x20: 0000000000001388 x19: ffff0000c0299648 x18: ffff0000ff7e01bc
[ 263.183597] x17: 00000000000a03c8 x16: 003fffffffffffff x15: c15e9f4d40b0ba44
[ 263.183644] x14: ffff800080c377c4 x13: f39e923bc472b73f x12: fbdb674df0d86e0f
[ 263.183692] x11: 5a679e689a9836bb x10: 0ca385496fded8a0 x9 : 00000000200005ea
[ 263.183739] x8 : 0000000000030000 x7 : 000000000000010f x6 : ffff800080c39340
[ 263.183786] x5 : ffff0000c0298cc0 x4 : 0000000000000000 x3 : 00000000000013c0
[ 263.183831] x2 : ffff0000c029ad00 x1 : ffff0000c029ab00 x0 : 000000000000203b
[ 263.183885] Kernel panic - not syncing: Asynchronous SError Interrupt
[ 263.183912] CPU: 3 UID: 0 PID: 0 Comm: swapper/3 Tainted: G M 7.4.0-rc2-00101-g8c75c70989f1 #6 PREEMPT(full)
[ 263.183961] Tainted: [M]=MACHINE_CHECK
[ 263.183973] Hardware name: Renesas SMARC EVK version 2 based on r9a09g047e57 (DT)
[ 263.183990] Call trace:
[ 263.184003] show_stack+0x18/0x24 (C)
[ 263.184048] dump_stack_lvl+0x34/0x8c
[ 263.184103] dump_stack+0x18/0x24
[ 263.184153] vpanic+0x380/0x3ac
[ 263.184204] nmi_panic+0xf0/0x108
[ 263.184252] arm64_serror_panic+0x70/0x80
[ 263.184294] arm64_is_fatal_ras_serror+0x3c/0xac
[ 263.184336] do_serror+0x5c/0x70
[ 263.184374] el1h_64_error_handler+0x34/0x54
[ 263.184433] el1h_64_error+0x78/0x7c
[ 263.184472] stmmac_tx_timer_arm+0x60/0xa4 (P)
[ 263.184526] stmmac_xmit+0xd4c/0x1650
[ 263.184580] dev_hard_start_xmit+0x8c/0x104
[ 263.184622] sch_direct_xmit+0x8c/0x35c
[ 263.184668] __dev_queue_xmit+0x808/0xf2c
[ 263.184706] ip_finish_output2+0x458/0x5ac
[ 263.184749] __ip_finish_output+0x1dc/0x26c
[ 263.184789] ip_finish_output+0x34/0x148
[ 263.184828] ip_output+0x70/0x114
[ 263.184866] __ip_queue_xmit+0x164/0x410
[ 263.184906] ip_queue_xmit+0x14/0x20
[ 263.184945] __tcp_transmit_skb+0x548/0xe30
[ 263.184993] __tcp_retransmit_skb.part.0+0x2a4/0x950
[ 263.185041] tcp_retransmit_skb+0x50/0x104
[ 263.185086] tcp_retransmit_timer+0x430/0xb68
[ 263.185135] tcp_write_timer_handler+0x180/0x1f0
[ 263.185185] tcp_write_timer+0x130/0x17c
[ 263.185232] call_timer_fn.isra.0+0x24/0x80
[ 263.185278] __run_timers+0x228/0x270
[ 263.185319] timer_expire_remote+0x50/0x68
[ 263.185365] tmigr_handle_remote_up+0x1b4/0x280
[ 263.185408] __walk_groups_from+0x3c/0x9c
[ 263.185449] tmigr_handle_remote+0xd8/0xf8
[ 263.185492] run_timer_softirq+0xec/0xfc
[ 263.185535] handle_softirqs+0x128/0x2b4
[ 263.185577] __do_softirq+0x14/0x20
[ 263.185614] ____do_softirq+0x10/0x1c
[ 263.185656] call_on_irq_stack+0x30/0x48
[ 263.185698] do_softirq_own_stack+0x1c/0x28
[ 263.185742] __irq_exit_rcu+0xf0/0x11c
[ 263.185782] irq_exit_rcu+0x10/0x1c
[ 263.185821] el1_interrupt+0x40/0x60
[ 263.185873] el1h_64_irq_handler+0x18/0x24
[ 263.185928] el1h_64_irq+0x78/0x7c
[ 263.185965] default_idle_call+0x28/0x44 (P)
[ 263.186008] do_idle+0x240/0x2f0
[ 263.186051] cpu_startup_entry+0x34/0x3c
[ 263.186093] secondary_start_kernel+0x13c/0x15c
[ 263.186148] __secondary_switched+0xc0/0xc4
[ 263.186203] SMP: stopping secondary CPUs
[ 263.186233] Kernel Offset: disabled
[ 263.186243] CPU features: 0x0,40000000,00400028,01180a02,0800e21b
[ 263.186269] Memory Limit: none
[ 263.544217] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
Which I was able to fix with:
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -8606,6 +8606,9 @@ int stmmac_suspend(struct device *dev)
stmmac_disable_all_queues(priv);
+ /* NAPI may have woken a TX queue after netif_device_detach() */
+ netif_tx_disable(ndev);
+
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer);
This issue IMHO looks similar to the one fixed by
commit 7e87508b5c4d ("net: bcmgenet: stop Tx NAPI before disabling the queues").
Are you getting the same? What do you think?
Thanks in advance.
Kind regards,
Tommaso
> - Native XDP/AF_XDP zero-copy RX continued after two suspend/resume cycles
> with the receive socket kept open.
> - Zero-copy TX-only, with no RX fill buffers, is tested ok after one suspend/resume
> cycle, with no fatal bus error.
> - Pausing the receive application with SIGSTOP and resuming it with SIGCONT
> recovered RX without recreating the socket.
> - xdpsock is used for native XDP testing.
>
> Additional testing would be welcome for RX sockets initially supplied with
> 0/1/8/15 fill buffers, replenishment in batches below 16, and those states
> across suspend/resume. These differ from TX-only with no RX fill buffers.
> Legacy descriptor cores, GMAC4, chain mode, timestamp-specific descriptor
> paths, multiple XSK queues and long suspend/resume runs remain untested.
>
> Missing page_pool buffers are still allocated during resume. Allocation
> failure returns -ENOMEM without restarting DMA and leaves the device
> detached. This adds a trigger for existing resume error-recovery problems;
> full close/open recovery, including NAPI and platform power handling, is
> separate work. The Medium-severity AI review on failure recovery is not
> fully resolved by this revision.
>
> Changes in v6:
> - Add a separate fix to restore the bound XSK TX pool after resume cleanup,
> addressing TX-only stalls found during XGMAC validation.
> - Factor resume descriptor work into one TX queue loop and one RX loop,
> following Thomas's review, and use common error cleanup.
> - Restore addresses and chain pointers before initializing RX control fields,
> preserving legacy fields and RIWT/IOC policy without a separate OWN loop.
> - Add format-specific RX ownership clearing for unfilled XSK descriptors.
> - Track pending XSK refills independently of circular index equality; retry
> short refills and prevent consumption of unfilled descriptors.
> - Restore a populated XSK prefix and retain later attached buffers for refill;
> recompute the allocation count, initial tail and pending region.
> - Select XSK buffer size independently of the initial allocation count.
> - Discard any partially assembled RX frame before resetting the RX ring after resume.
>
> Link to v5:
> https://lore.kernel.org/netdev/20261025100636.613670-1-dinghui1111@163.com/
>
> Changes in v5:
> - Target net and add Fixes tags to both patches.
> - Split the allocation-flags fix into a separate patch, with a Fixes tag
> identifying the page_pool conversion that stopped honoring the flags.
> - Share page_pool and XSK buffer preparation with the RX refill paths.
> - Allocate missing secondary pages even when the primary page exists,
> using the current baseline's buffer2 capability check.
> - Condense the reinitialization kernel-doc to two paragraphs.
> - Restore descriptor addresses before the final dma_wmb()/OWN pass.
> - Clarify that unavailable XSK slots remain CPU-owned and may stop DMA
> with RBU, rather than claiming that hardware skips them.
> - Power down legacy SerDes if RX descriptor restoration fails.
>
> Link to v4:
> https://lore.kernel.org/netdev/20260627122533.1165324-1-dinghui1111@163.com/
>
> Changes in v4:
> - Document the return value of stmmac_reinit_rx_descriptors().
>
> Link to v3:
> https://lore.kernel.org/netdev/20260604144557.3175399-1-dinghui1111@163.com/
>
> Changes in v3:
> - Allocate missing page_pool buffers with GFP_KERNEL and abort resume
> on allocation failure.
> - Try to allocate missing XSK buffers and clear descriptors when the
> fill ring cannot supply a buffer.
> - Restore OWN after programming addresses and rebuilding chain pointers.
> - Honor the flags argument of stmmac_init_rx_buffers().
> - Restore RX descriptors after stmmac_clear_descriptors().
>
> Link to v2:
> https://lore.kernel.org/netdev/20260526022620.501229-1-dinghui1111@163.com/
>
> Changes in v2:
> - Introduce a helper to restore addresses from existing RX buffers.
> - Update the commit message.
>
> Link to v1:
> https://lore.kernel.org/netdev/20260515053856.2310369-1-dinghui1111@163.com/
>
> Ding Hui (4):
> net: stmmac: honor allocation flags when initializing RX buffers
> net: stmmac: track unfilled XSK RX descriptors explicitly
> net: stmmac: restore RX descriptor buffer addresses on resume
> net: stmmac: restore the XSK TX pool on resume
>
> .../ethernet/stmicro/stmmac/dwmac4_descs.c | 6 +
> .../ethernet/stmicro/stmmac/dwxgmac2_descs.c | 6 +
> .../net/ethernet/stmicro/stmmac/enh_desc.c | 6 +
> drivers/net/ethernet/stmicro/stmmac/hwif.h | 3 +
> .../net/ethernet/stmicro/stmmac/norm_desc.c | 6 +
> drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 +
> .../net/ethernet/stmicro/stmmac/stmmac_main.c | 277 +++++++++++++-----
> 7 files changed, 228 insertions(+), 78 deletions(-)
>
>
> base-commit: 7076f684d5132e6a6145e1da2fa74771ecd052e5
> --
> 2.34.1
>
prev parent reply other threads:[~2026-11-12 16:38 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 12:38 Ding Hui
2026-11-10 12:38 ` [PATCH net v6 1/4] net: stmmac: honor allocation flags when initializing RX buffers Ding Hui
2026-11-10 12:38 ` [PATCH net v6 2/4] net: stmmac: track unfilled XSK RX descriptors explicitly Ding Hui
2026-11-10 12:38 ` [PATCH net v6 3/4] net: stmmac: restore RX descriptor buffer addresses on resume Ding Hui
2026-11-10 12:38 ` [PATCH net v6 4/4] net: stmmac: restore the XSK TX pool " Ding Hui
2026-11-12 16:38 ` Tommaso Merciai [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=avXreY2EBUuQ2gpU@tom-desktop \
--to=tommaso.merciai.xr@bp.renesas.com \
--cc=alexandre.torgue@foss.st.com \
--cc=andrew+netdev@lunn.ch \
--cc=biju.das.jz@bp.renesas.com \
--cc=davem@davemloft.net \
--cc=dinghui1111@163.com \
--cc=dinghui@lixiang.com \
--cc=edumazet@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=liuxuanjun@lixiang.com \
--cc=maxime.chevallier@bootlin.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=tomm.merciai@gmail.com \
--cc=xiasanbo@lixiang.com \
--cc=yangchen11@lixiang.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®