From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
To: Wang Zhan <wang.zhan@smartx.com>, netdev@vger.kernel.org
Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, horms@kernel.org, keyong.sun@smartx.com,
Willem de Bruijn <willemdebruijn.kernel@gmail.com>,
Jason Wang <jasowangio@gmail.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Aaron Conole <aconole@redhat.com>,
Eelco Chaudron <echaudro@redhat.com>,
Ilya Maximets <i.maximets@ovn.org>,
dev@openvswitch.org, Daniel Borkmann <daniel@iogearbox.net>,
Neal Cardwell <ncardwell@google.com>,
Kuniyuki Iwashima <kuniyu@google.com>,
Alice Mikityanska <alice@isovalent.com>,
David Laight <david.laight.linux@gmail.com>,
Wang Zhan <wang.zhan@smartx.com>
Subject: Re: [PATCH net-next v4 3/5] net: gso: support re-segmentation of TCP GSO skbs
Date: Wed, 30 Sep 2026 15:52:01 -0400 [thread overview]
Message-ID: <willemdebruijn.kernel.30c9628e9a7f6@gmail.com> (raw)
In-Reply-To: <20260930111526.2183107-4-wang.zhan@smartx.com>
Wang Zhan wrote:
> The re-segmentation added by the next patch splits an oversized TCP GSO skb
> into several GSO skbs which fit the device limits. That needs the GSO
> engine to group several MSS segments into one output skb, so let callers
> set the number of MSS segments each output skb may carry and pass it
> through the existing __skb_gso_segment() entry point. Ordinary callers
> pass zero for no limit.
>
> Without max_segs, skb_segment() groups several MSS into one output skb only
> for a device which advertises NETIF_F_GSO_PARTIAL or for a skb with a
> frag_list which can be split into uniform pieces, and falls back to one
> segment per skb otherwise. A caller which sets max_segs asks for the
> grouping regardless, so the block which makes that decision is skipped.
> Callers which pass zero keep it, and the re-segmentation path only runs for
> an unencapsulated TCP skb without a frag_list.
>
> The output stays a GSO skb: gso_size is the original MSS and gso_segs is
> the number of MSS it holds, so a downstream device can still perform
> ordinary TSO. Store max_segs in the existing skb_gso_cb scratch context,
> alongside the call-local data_offset and mac_offset fields, so that the
> segmentation methods keep their signature. A zero max_segs value means
> that no limit is active; it is not a persistent skb flag.
>
> Assisted-by: LLM
Reviewed-by: Willem de Bruijn <willemb@google.com>
If respinning, consider asking the LLM to rewrite commit messages to be
more concise.
> @@ -4839,7 +4840,7 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
> csum = !!can_checksum_protocol(features, proto);
>
> if (sg && csum && !gso_by_frags) {
> - if (!(features & NETIF_F_GSO_PARTIAL)) {
> + if (!max_segs && !(features & NETIF_F_GSO_PARTIAL)) {
> struct sk_buff *iter;
> unsigned int frag_len;
>
> @@ -4874,7 +4875,10 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
> * now.
> */
> DEBUG_NET_WARN_ON_ONCE(len / mss > GSO_MAX_SEGS);
> - partial_segs = min(len / mss, GSO_MAX_SEGS);
> + if (max_segs)
> + partial_segs = min(len / mss, max_segs);
> + else
> + partial_segs = min(len / mss, GSO_MAX_SEGS);
> if (partial_segs > 1)
> mss *= partial_segs;
> else
Not new with this series, nor high priority, so only if respinning:
Consider adding
@@ -5121,7 +5121,7 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
}
if (tail->len - doffset <= gso_size)
- skb_shinfo(tail)->gso_size = 0;
+ skb_gso_reset(tail);
else if (tail != segs)
Because packets looped into the Rx path will sometimes have their
gso_segs used without first checking gso_size / skb_is_gso. For instance
in ip_rcv_core __IP_ADD_STATS.
Additionally for patch 5/5, consider one testcase that resegments, but for
which the last skb is not a GSO skb.
> diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
> index 21870341432552..e793aead68372d 100644
> --- a/net/openvswitch/datapath.c
> +++ b/net/openvswitch/datapath.c
> @@ -375,7 +375,7 @@ static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb,
> int err;
>
> BUILD_BUG_ON(sizeof(*OVS_CB(skb)) > SKB_GSO_CB_OFFSET);
> - segs = __skb_gso_segment(skb, NETIF_F_SG, false);
> + segs = __skb_gso_segment(skb, NETIF_F_SG, false, 0);
> if (IS_ERR(segs))
> return PTR_ERR(segs);
> if (segs == NULL)
> --
> 2.47.3
>
next prev parent reply other threads:[~2026-09-30 19:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-30 11:15 [PATCH net-next v4 0/5] net: re-segment oversized TCP GSO skbs Wang Zhan
2026-09-30 11:15 ` [PATCH net-next v4 1/5] net: core: use the packet's L3 protocol for the GSO size limit Wang Zhan
2026-09-30 19:40 ` Willem de Bruijn
2026-09-30 11:15 ` [PATCH net-next v4 2/5] net: core: factor out the GSO device limit check Wang Zhan
2026-09-30 19:40 ` Willem de Bruijn
2026-09-30 11:15 ` [PATCH net-next v4 3/5] net: gso: support re-segmentation of TCP GSO skbs Wang Zhan
2026-09-30 19:52 ` Willem de Bruijn [this message]
2026-10-02 16:51 ` Wang Zhan
2026-10-02 11:16 ` netdev-bot+sashiko
2026-09-30 11:15 ` [PATCH net-next v4 4/5] net: core: re-segment oversized " Wang Zhan
2026-09-30 19:52 ` Willem de Bruijn
2026-10-02 11:16 ` netdev-bot+sashiko
2026-09-30 11:15 ` [PATCH net-next v4 5/5] net: net_test: add tests for TCP re-segmentation Wang Zhan
2026-09-30 19:53 ` Willem de Bruijn
2026-10-02 17:59 ` Wang Zhan
2026-10-03 19:10 ` Willem de Bruijn
2026-10-02 11:16 ` netdev-bot+sashiko
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=willemdebruijn.kernel.30c9628e9a7f6@gmail.com \
--to=willemdebruijn.kernel@gmail.com \
--cc=aconole@redhat.com \
--cc=alice@isovalent.com \
--cc=andrew+netdev@lunn.ch \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=david.laight.linux@gmail.com \
--cc=dev@openvswitch.org \
--cc=echaudro@redhat.com \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=i.maximets@ovn.org \
--cc=jasowangio@gmail.com \
--cc=keyong.sun@smartx.com \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=wang.zhan@smartx.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 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.