Re: [PATCH net] net: skbuff: don't copy alloc_cpu in skb header copies
From: Eric Dumazet
Date: Mon Oct 12 2026 - 13:16:18 EST
Le lun. 12 oct. 2026 à 14:48, Carolina Jubran <cjubran@xxxxxxxxxx> a écrit :
>
> Commit 68822bdf76f1 ("net: generalize skb freeing deferral to
> per-cpu lists") added alloc_cpu to struct sk_buff and placed it in the
> headers group copied by __copy_skb_header().
>
> This is wrong for newly allocated skbs. For example, skb_segment()
> allocates a new skb and records the current CPU in alloc_cpu, but
> __copy_skb_header() overwrites it with the value from the original skb.
>
> If the original skb was allocated on another CPU, the segment may later
> be treated as remotely allocated and unnecessarily deferred there when
> it is freed.
>
> Move alloc_cpu out of the headers group so it is preserved across
> header copies. Initialize it explicitly in skb_clone(), which allocates
> the skb object directly instead of going through __alloc_skb().
>
> This was discovered while investigating a throughput regression with
> software IPsec. The load used 512 IPsec tunnels carrying traffic over
> VXLAN, with 512 parallel iperf3 flows and an MTU of 4500.
>
> Before the fix:
>
> 16.09% queued_spin_lock_slowpath
> |
> --15.90%--_raw_spin_lock_irqsave
> |
> --9.37%--__slab_free
> kfree
> skb_release_data
> napi_consume_skb
> mlx5e_poll_tx_cq
>
> After the fix:
>
> 6.84% queued_spin_lock_slowpath
> |
> --6.57%--_raw_spin_lock_irqsave
> |
> --5.00%--__slab_free
> kfree
> skb_release_data
> napi_consume_skb
> mlx5e_poll_tx_cq
>
> Fixes: 68822bdf76f1 ("net: generalize skb freeing deferral to per-cpu lists")
> Signed-off-by: Carolina Jubran <cjubran@xxxxxxxxxx>
> Reviewed-by: Dragos Tatulea <dtatulea@xxxxxxxxxx>
> ---
> include/linux/skbuff.h | 2 +-
> net/core/skbuff.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index a3ff380d43f01..2d5277765939f 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -963,6 +963,7 @@ struct sk_buff {
> #ifdef CONFIG_SKB_EXTENSIONS
> __u8 active_extensions;
> #endif
> + u16 alloc_cpu;
spaces instead of tab here.
I had on my plate a better placement of alloc_cpu, end, tail...
I would move alloc_cpu _after_ headers group.