]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: fclone allocation small optimization
authorEric Dumazet <edumazet@google.com>
Fri, 16 Jan 2026 16:44:02 +0000 (16:44 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 Jan 2026 02:25:33 +0000 (18:25 -0800)
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>
net/core/skbuff.c

index f2367818c130bcd3095e9bd78fbc9f9a0ac83d4b..1c2b9ae7bce6457395a82d5bd577a9e125eceb95 100644 (file)
@@ -723,7 +723,14 @@ fallback:
 
                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);
        }