From: David Laight <david.laight.linux@gmail.com>
To: Pascal Kneuper <PKneuper@dspace.de>
Cc: kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net,
edumazet@google.com, pabeni@redhat.com,
mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com,
rmk+kernel@armlinux.org.uk, maxime.chevallier@bootlin.com,
0x1207@gmail.com, si.yanteng@linux.dev, larysa.zaremba@intel.com,
aleksander.lobakin@intel.com, netdev@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, DBaldin@dspace.de
Subject: Re: [PATCH net v2] net: stmmac: restore NET_IP_ALIGN in the RX DMA offset
Date: Mon, 24 Aug 2026 15:23:12 +0100 [thread overview]
Message-ID: <20260824152312.3f6dd2b7@pumpkin> (raw)
In-Reply-To: <20260824125014.47862-1-PKneuper@dspace.de>
On Mon, 24 Aug 2026 14:50:14 +0200 (CEST)
Pascal Kneuper <PKneuper@dspace.de> wrote:
> Since the RX path was converted to zero-copy, the page pool page is handed
> to the stack directly as the skb head, and the offset the DMA engine writes
> at is what determines the alignment of the packet headers.
>
> Before the conversion the payload was copied into an skb obtained from
> napi_alloc_skb(), which reserves NET_SKB_PAD + NET_IP_ALIGN. The
> conversion moved the headroom into stmmac_rx_offset() but did not carry
> over NET_IP_ALIGN, so on architectures where NET_IP_ALIGN is 2 the IP
> header now lands misaligned:
>
> 64 (NET_SKB_PAD) + 14 (ethernet) + 20 (IP) = 98
>
> Same for the XDP branch:
>
> 256 (XDP_PACKET_HEADROOM) + 14 (ethernet) + 20 (IP) = 290
>
> On ARM32 this is fatal, because ldm and ldrd trap on unaligned addresses
> even when CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is set.
I suspect an alternative is mark the structure(s) as __packed
when CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is set.
The compiler will then only use 'normal' memory instructions which
won't fault.
OTOH aligning the buffers is likely to be better.
David
>
> Any received echo request panics the machine, e.g:
>
> Unhandled fault: alignment exception (0x001) at 0x81873062
> Internal error: : 1 [#1] SMP ARM
> Hardware name: Altera SOCFPGA Arria10
> PC is at icmp_echo+0x38/0xa8
> LR is at icmp_rcv+0x22c/0x370
> Call trace:
> icmp_echo from icmp_rcv+0x22c/0x370
> icmp_rcv from ip_protocol_deliver_rcu+0x2c/0x224
> ip_protocol_deliver_rcu from ip_local_deliver+0xc8/0x1a0
> ip_local_deliver from ip_sublist_rcv_finish+0x3c/0x50
> ip_sublist_rcv_finish from ip_list_rcv_finish+0x110/0x118
> ip_list_rcv_finish from ip_list_rcv+0xc8/0xdc
> ip_list_rcv from __netif_receive_skb_list_core+0x170/0x1c0
> ...
> napi_complete_done from stmmac_napi_poll_rx+0xcb0/0x1030
> Code: e24dd068 e59020a0 e28dc010 e0822001 (e8920003)
> Kernel panic - not syncing: Fatal exception in interrupt
>
> The faulting instruction is the ldm of *icmp_hdr(skb) in icmp_echo().
>
> Fix by adding NET_IP_ALIGN back to the RX offset, which restores the
> alignment the stack used to get.
>
> Note that commit a955318fe67e ("stmmac: align RX buffers") made a similar
> change in 2021 and was reverted by commit 12d125b4574b ("stmmac: Revert
> "stmmac: align RX buffers"") because it caused packet corruption. That
> patch raised the offset from 0 without adjusting the buffer size
> accounting, so the DMA engine could arguably write past the end of the RX
> buffers, though this was never root caused.
> Commit df542f669307 ("net: stmmac: Switch to zero-copy in non-XDP RX
> path") since derives the page pool allocation from stmmac_rx_offset(), so
> the extra bytes are accounted for.
>
> Fixes: df542f669307 ("net: stmmac: Switch to zero-copy in non-XDP RX path")
> Cc: Daniel Baldin <DBaldin@dspace.de>
> Assisted-by: GitHub-Copilot-CLI:claude-opus-5
> Signed-off-by: Pascal Kneuper <PKneuper@dspace.de>
> ---
> v2:
> - also add NET_IP_ALIGN to the XDP branch, reproduced the same panic
> with an XDP_PASS program attached (Jakub Kicinski)
> - retitle accordingly, v1 was non-XDP only
>
> drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index a71f0df263785..4d4b155d0d931 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -1527,9 +1527,9 @@ static void stmmac_display_rings(struct stmmac_priv *priv,
> static unsigned int stmmac_rx_offset(struct stmmac_priv *priv)
> {
> if (stmmac_xdp_is_enabled(priv))
> - return XDP_PACKET_HEADROOM;
> + return XDP_PACKET_HEADROOM + NET_IP_ALIGN;
>
> - return NET_SKB_PAD;
> + return NET_SKB_PAD + NET_IP_ALIGN;
> }
>
> static int stmmac_set_bfsize(int mtu)
prev parent reply other threads:[~2026-08-24 14:23 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-13 9:29 [PATCH net] net: stmmac: restore NET_IP_ALIGN in the non-XDP RX path Pascal Kneuper
2026-08-18 1:22 ` Jakub Kicinski
2026-08-24 12:13 ` Pascal Kneuper
2026-08-24 12:50 ` [PATCH net v2] net: stmmac: restore NET_IP_ALIGN in the RX DMA offset Pascal Kneuper
2026-08-24 14:23 ` David Laight [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=20260824152312.3f6dd2b7@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=0x1207@gmail.com \
--cc=DBaldin@dspace.de \
--cc=PKneuper@dspace.de \
--cc=aleksander.lobakin@intel.com \
--cc=alexandre.torgue@foss.st.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=larysa.zaremba@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=maxime.chevallier@bootlin.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rmk+kernel@armlinux.org.uk \
--cc=si.yanteng@linux.dev \
/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