From: Xin Xie <xiexinet@gmail.com>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, horms@kernel.org, andrew+netdev@lunn.ch,
qingfang.deng@linux.dev, shuah@kernel.org,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
Xin Xie <xiexinet@gmail.com>
Subject: [RESEND PATCH net 0/4] net: hsr: fix GRO/GSO super-packet handling
Date: Wed, 22 Jul 2026 19:18:32 +0200 [thread overview]
Message-ID: <20260722171836.196-1-xiexinet@gmail.com> (raw)
[resend: the previous cover letter was silently dropped by the
sender's mail provider after SMTP acceptance; the four patches
themselves are byte-identical.]
HSR/PRP forward frames one by one: each wire frame gets its own tag
or RCT and sequence number, and duplicate discard is per frame. Two
aggregation mechanisms break that per-frame assumption:
* On RX, a lower device that aggregates frames into a GRO
super-packet feeds the HSR receive and forward paths something
they cannot handle: frames are dropped, and on memory-constrained
devices processing super-skbs in softirq context also pressures
atomic allocation.
* At the forward entry, a GSO super-packet (locally generated on
the master, or delivered intact by software NICs such as veth)
would be tagged and forwarded as a single frame, violating
per-frame wire semantics.
Patch 1 adds netif_disable_gro() and dev_disable_gro() alongside
the existing LRO helpers. HSR calls the public wrapper at
enslavement time, while the networking core handles the generic
feature update and recursive lower-device traversal. Enslavement to
an HSR/PRP master therefore strips NETIF_F_GRO and NETIF_F_GRO_HW
on the lower device.
Patch 2 is a preparatory locking change with forwarding semantics
unchanged: it shrinks hsr->seqnr_lock from whole hsr_forward_skb()
calls to the individual sequence counter updates, so that the
segmentation work of patch 3 (per-segment allocation, checksums and
forwarding) never runs with BH disabled under the global sequence
lock. Patch 3 depends on patch 2; please keep them together for
stable.
Patch 3 unfolds the remaining GSO super-packets at the forward
entry with the top-level GSO dispatch (__skb_gso_segment()), so
each wire frame still gets its own tag and sequence number.
Segmentation is offered only for ingress roles whose frames are
known to be plain Ethernet: the master (locally generated) and the
interlink (SAN side, untagged). A super-packet from a LAN slave may
carry per-frame HSR tags or PRP RCT trailers that software
segmentation cannot recover, and an already-tagged HSR/PRP
super-packet violates per-frame wire semantics; both are rejected
by ingress-port policy. The HSR master also stops advertising
NETIF_F_GSO_MASK so locally generated traffic is segmented as
early as possible.
Patch 4 adds a kselftest covering the above: GRO disabled on
enslaved devices, no GSO/TSO advertised by the HSR master, and a
TCP stream from a TSO-enabled SAN through an HSR DUT completing
with zero retransmits.
Validation:
* build: W=1 allmodconfig and allyesconfig, base vs patched - no
new warnings.
* selftests: hsr_gro_superpacket (new), hsr_ping, prp_ping and
hsr_redbox pass on QEMU x86_64 and on physical igb lower devices.
* functional: SAN TSO streams unfold per-frame with zero
retransmits (IPv4, IPv6, VLAN); LAN-slave and GRO-merged
super-packets are dropped by policy; master/interlink concurrency
under PROVE_LOCKING is clean.
* physical igb lower devices: GRO stripped at enslavement;
force-enabled generic GRO super-packets unfold at line rate with
a clean dmesg.
Xin Xie (4):
net: hsr: fix packet drops caused by GRO superpackets
net: hsr: shrink seqnr_lock to sequence counter updates
net: hsr: unfold GSO super-packets at the forward entry
selftests: net: hsr: add GRO super-packet forwarding test
include/linux/netdevice.h | 2 +
net/core/dev.c | 18 ++
net/core/dev_api.c | 16 ++
net/hsr/hsr_device.c | 17 +-
net/hsr/hsr_forward.c | 53 +++-
net/hsr/hsr_slave.c | 12 +-
tools/testing/selftests/net/hsr/Makefile | 1 +
.../selftests/net/hsr/hsr_gro_superpacket.sh | 249 ++++++++++++++++++
8 files changed, 344 insertions(+), 24 deletions(-)
create mode 100755 tools/testing/selftests/net/hsr/hsr_gro_superpacket.sh
base-commit: ba712ecfd942b68b21a4b0a5daaf72f6616cc66d
--
2.43.0
next reply other threads:[~2026-07-22 17:18 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 17:18 Xin Xie [this message]
2026-07-22 17:18 ` [PATCH net 1/4] net: hsr: fix packet drops caused by GRO superpackets Xin Xie
2026-07-22 17:18 ` [PATCH net 2/4] net: hsr: shrink seqnr_lock to sequence counter updates Xin Xie
2026-07-22 17:18 ` [PATCH net 3/4] net: hsr: unfold GSO super-packets at the forward entry Xin Xie
2026-07-22 17:18 ` [PATCH net 4/4] selftests: net: hsr: add GRO super-packet forwarding test Xin Xie
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=20260722171836.196-1-xiexinet@gmail.com \
--to=xiexinet@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=qingfang.deng@linux.dev \
--cc=shuah@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.