* [PATCH net-next v3] seg6: reallocate the skb head on L2 encapsulation only when needed
@ 2026-09-25 14:49 Yuya Kusakabe
2026-09-29 2:26 ` Hangbin Liu
0 siblings, 1 reply; 2+ messages in thread
From: Yuya Kusakabe @ 2026-09-25 14:49 UTC (permalink / raw)
To: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Yuya Kusakabe
The L2 encapsulation modes of the seg6 lwtunnel reallocate the skb head
on every packet, where the IPv6 encapsulation modes reallocate only when
they have to. Ask for the whole encapsulation up front instead, so that
the reallocation happens at most once and only when the headroom really
is too small:
skb->mac_len + sizeof(struct ipv6hdr) + ipv6_optlen(tinfo->srh)
+ dst_dev_overhead(cache_dst, skb)
__seg6_do_srh_encap() then finds the room it needs and its own
skb_cow_head() becomes a no-op.
Drivers reserve more than that on the forwarding path, so the
reallocation usually disappears altogether. A single-segment policy
on ixgbe needs
14 (mac_len) + 40 (ipv6hdr) + 24 (SRH) + 16 (LL_RESERVED_SPACE) = 94
against the 206 bytes the driver leaves. Where the headroom is
smaller, as on a veth pair, pskb_expand_head() is called once per
forwarded packet instead of twice. Asking only for skb->mac_len would
still take two whenever the skb is header-cloned, because the cow that
unclones it does not also make room for the outer header.
The cost is amplified by CONFIG_INIT_ON_ALLOC_DEFAULT_ON, which many
distributions enable: every new head is zeroed in full, and that memset
alone accounts for 16% of the datapath profile.
Throughput at 0.5% packet loss, 64-byte frames forwarded through one
2.30 GHz core (Xeon E5-2650 v3, ixgbe 82599ES), offered by TRex and
binary-searched over 10 runs of 10 s:
Before: 654.6 kpps
After: 965.7 kpps
Assisted-by: LLM
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
---
Changes in v3:
- No code change. Rebased onto net-next, which now has 87cd6b717e40
("net: ipv6: keep room for the mac header in dst_dev_overhead()").
That fixes the headroom shortfall Sashiko reported on v2, which
predates this patch and affects every seg6, ioam6 and rpl
encapsulation.
- Link to v2: https://patch.msgid.link/20260903-seg6-l2cow-v2-1-f37b3b35416f@gmail.com
Changes in v2:
- Ask for the whole encapsulation headroom at once, so that a cloned
skb no longer takes a second reallocation inside
__seg6_do_srh_encap() [Eric]
- Re-measure against unpatched net-next rather than an older base
- Link to v1: https://lore.kernel.org/r/20260902-seg6-l2cow-v1-1-e823ce216454@gmail.com
---
net/ipv6/seg6_iptunnel.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c
index 61c6a27bf202..ecd8146089ee 100644
--- a/net/ipv6/seg6_iptunnel.c
+++ b/net/ipv6/seg6_iptunnel.c
@@ -400,6 +400,7 @@ static int seg6_do_srh(struct sk_buff *skb, struct dst_entry *cache_dst)
struct dst_entry *dst = skb_dst(skb);
struct seg6_iptunnel_encap *tinfo;
struct seg6_lwt *slwt;
+ unsigned int headroom;
int proto, err = 0;
slwt = seg6_lwt_lwtunnel(dst->lwtstate);
@@ -446,8 +447,13 @@ static int seg6_do_srh(struct sk_buff *skb, struct dst_entry *cache_dst)
if (!skb_mac_header_was_set(skb))
return -EINVAL;
- if (pskb_expand_head(skb, skb->mac_len, 0, GFP_ATOMIC) < 0)
- return -ENOMEM;
+ headroom = skb->mac_len + sizeof(struct ipv6hdr) +
+ ipv6_optlen(tinfo->srh) +
+ dst_dev_overhead(cache_dst, skb);
+
+ err = skb_cow_head(skb, headroom);
+ if (unlikely(err))
+ return err;
skb_mac_header_rebuild(skb);
skb_push(skb, skb->mac_len);
---
base-commit: 42a9fb3382fc2573e92f41d203b095d9a372cfc9
change-id: 20260902-seg6-l2cow-77dc3ba41232
Best regards,
--
Yuya Kusakabe <yuya.kusakabe@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH net-next v3] seg6: reallocate the skb head on L2 encapsulation only when needed
2026-09-25 14:49 [PATCH net-next v3] seg6: reallocate the skb head on L2 encapsulation only when needed Yuya Kusakabe
@ 2026-09-29 2:26 ` Hangbin Liu
0 siblings, 0 replies; 2+ messages in thread
From: Hangbin Liu @ 2026-09-29 2:26 UTC (permalink / raw)
To: Yuya Kusakabe
Cc: Andrea Mayer, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, netdev, linux-kernel
On Fri, Sep 25, 2026 at 11:49:53PM +0900, Yuya Kusakabe wrote:
> The L2 encapsulation modes of the seg6 lwtunnel reallocate the skb head
> on every packet, where the IPv6 encapsulation modes reallocate only when
> they have to. Ask for the whole encapsulation up front instead, so that
> the reallocation happens at most once and only when the headroom really
> is too small:
>
> skb->mac_len + sizeof(struct ipv6hdr) + ipv6_optlen(tinfo->srh)
> + dst_dev_overhead(cache_dst, skb)
>
> __seg6_do_srh_encap() then finds the room it needs and its own
> skb_cow_head() becomes a no-op.
>
> Drivers reserve more than that on the forwarding path, so the
> reallocation usually disappears altogether. A single-segment policy
> on ixgbe needs
>
> 14 (mac_len) + 40 (ipv6hdr) + 24 (SRH) + 16 (LL_RESERVED_SPACE) = 94
>
> against the 206 bytes the driver leaves. Where the headroom is
> smaller, as on a veth pair, pskb_expand_head() is called once per
> forwarded packet instead of twice. Asking only for skb->mac_len would
> still take two whenever the skb is header-cloned, because the cow that
> unclones it does not also make room for the outer header.
>
> The cost is amplified by CONFIG_INIT_ON_ALLOC_DEFAULT_ON, which many
> distributions enable: every new head is zeroed in full, and that memset
> alone accounts for 16% of the datapath profile.
>
> Throughput at 0.5% packet loss, 64-byte frames forwarded through one
> 2.30 GHz core (Xeon E5-2650 v3, ixgbe 82599ES), offered by TRex and
> binary-searched over 10 runs of 10 s:
>
> Before: 654.6 kpps
> After: 965.7 kpps
>
> Assisted-by: LLM
> Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
> Reviewed-by: Eric Dumazet <edumazet@google.com>
> ---
> Changes in v3:
> - No code change. Rebased onto net-next, which now has 87cd6b717e40
> ("net: ipv6: keep room for the mac header in dst_dev_overhead()").
> That fixes the headroom shortfall Sashiko reported on v2, which
> predates this patch and affects every seg6, ioam6 and rpl
> encapsulation.
> - Link to v2: https://patch.msgid.link/20260903-seg6-l2cow-v2-1-f37b3b35416f@gmail.com
>
> Changes in v2:
> - Ask for the whole encapsulation headroom at once, so that a cloned
> skb no longer takes a second reallocation inside
> __seg6_do_srh_encap() [Eric]
> - Re-measure against unpatched net-next rather than an older base
> - Link to v1: https://lore.kernel.org/r/20260902-seg6-l2cow-v1-1-e823ce216454@gmail.com
> ---
> net/ipv6/seg6_iptunnel.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c
> index 61c6a27bf202..ecd8146089ee 100644
> --- a/net/ipv6/seg6_iptunnel.c
> +++ b/net/ipv6/seg6_iptunnel.c
> @@ -400,6 +400,7 @@ static int seg6_do_srh(struct sk_buff *skb, struct dst_entry *cache_dst)
> struct dst_entry *dst = skb_dst(skb);
> struct seg6_iptunnel_encap *tinfo;
> struct seg6_lwt *slwt;
> + unsigned int headroom;
> int proto, err = 0;
>
> slwt = seg6_lwt_lwtunnel(dst->lwtstate);
> @@ -446,8 +447,13 @@ static int seg6_do_srh(struct sk_buff *skb, struct dst_entry *cache_dst)
> if (!skb_mac_header_was_set(skb))
> return -EINVAL;
>
> - if (pskb_expand_head(skb, skb->mac_len, 0, GFP_ATOMIC) < 0)
> - return -ENOMEM;
> + headroom = skb->mac_len + sizeof(struct ipv6hdr) +
> + ipv6_optlen(tinfo->srh) +
> + dst_dev_overhead(cache_dst, skb);
> +
> + err = skb_cow_head(skb, headroom);
> + if (unlikely(err))
> + return err;
>
> skb_mac_header_rebuild(skb);
> skb_push(skb, skb->mac_len);
>
> ---
> base-commit: 42a9fb3382fc2573e92f41d203b095d9a372cfc9
> change-id: 20260902-seg6-l2cow-77dc3ba41232
>
> Best regards,
> --
> Yuya Kusakabe <yuya.kusakabe@gmail.com>
>
LGTM
Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-29 2:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-25 14:49 [PATCH net-next v3] seg6: reallocate the skb head on L2 encapsulation only when needed Yuya Kusakabe
2026-09-29 2:26 ` Hangbin Liu
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®