Re: [PATCH net-next V2 RESEND] tcp: shrink per-packet memset in __tcp_transmit_skb()

From: Eric Dumazet

Date: Wed Mar 04 2026 - 13:23:37 EST


On Wed, Mar 4, 2026 at 7:09 PM Matthieu Baerts <matttbe@xxxxxxxxxx> wrote:
>
> Hi Keita,
>
> On 04/03/2026 12:15, Keita Morisaki wrote:
> > Use struct_group() to group the three fields in tcp_out_options that are
> > read unconditionally by tcp_options_write() and bpf_skops_write_hdr_opt()
> > (mss, bpf_opt_len, num_sack_blocks), then replace the full-struct memset
> > with a targeted memset of only that group.
> >
> > struct tcp_out_options is 40 bytes without MPTCP and 96 bytes with
> > CONFIG_MPTCP=y (typical distro config). Every remaining field is either
> > assigned before first use by tcp_established_options()/tcp_syn_options(),
> > or gated behind its OPTION_* flag in tcp_options_write(). This memset
> > runs on every transmitted TCP packet, so shrinking it from 96 (or 40)
> > bytes to 4 bytes reduces per-packet overhead on the hot path.
> >
> > Assembly comparison (x86-64, GCC 13, CONFIG_MPTCP=y):
> >
> > Before: rep stos zeroing 96 bytes (5 instructions, 12 8-byte stores)
> > After: movl $0x0 zeroing 4 bytes (1 instruction, 1 store)
> >
> > Also add opts->options = 0 at the top of tcp_syn_options(), which
> > already used |= without a prior clear. tcp_established_options() already
> > clears opts->options at its top.
>
> Thank you for this patch! It looks good to me:
>
> Acked-by: Matthieu Baerts (NGI0) <matttbe@xxxxxxxxxx>

Apparently my Reviewed-by: tag was lost.

Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>