net: fclone allocation small optimization

After skb allocation, initial skb->fclone value is 0 (SKB_FCLONE_UNAVAILABLE)

We can replace one RMW sequence with a single OR instruction.

	movzbl 0x7e(%r13),%eax // skb->fclone = SKB_FCLONE_ORIG;
	and    $0xf3,%al
	or     $0x4,%al
	mov    %al,0x7e(%r13)
->
	or     $0x4,0x7e(%r13) // skb->fclone |= SKB_FCLONE_ORIG;

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260116164402.1872649-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Eric Dumazet
2026-01-16 16:44:02 +00:00
committed by Jakub Kicinski
parent ee7be82f8c
commit 79bfa5fb85

View File

@@ -723,7 +723,14 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
fclones = container_of(skb, struct sk_buff_fclones, skb1);
skb->fclone = SKB_FCLONE_ORIG;
/* skb->fclone is a 2bits field.
* Replace expensive RMW (skb->fclone = SKB_FCLONE_ORIG)
* with a single OR.
*/
BUILD_BUG_ON(SKB_FCLONE_UNAVAILABLE != 0);
DEBUG_NET_WARN_ON_ONCE(skb->fclone != SKB_FCLONE_UNAVAILABLE);
skb->fclone |= SKB_FCLONE_ORIG;
refcount_set(&fclones->fclone_ref, 1);
}