FAILED: patch "[PATCH] Revert "net: skb: introduce and use a single page frag cache"" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 011b0335903832facca86cd8ed05d7d8d94c9c76
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025021859-upturned-trailside-5b21@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 011b0335903832facca86cd8ed05d7d8d94c9c76 Mon Sep 17 00:00:00 2001
From: Paolo Abeni <[email protected]>
Date: Thu, 6 Feb 2025 22:28:48 +0100
Subject: [PATCH] Revert "net: skb: introduce and use a single page frag cache"
This reverts commit dbae2b062824 ("net: skb: introduce and use a single page frag cache"). The intended goal of such change was to counter a performance regression introduced by commit 3226b158e67c ("net: avoid 32 x truesize under-estimation for tiny skbs").
Unfortunately, the blamed commit introduces another regression for the virtio_net driver. Such a driver calls napi_alloc_skb() with a tiny size, so that the whole head frag could fit a 512-byte block.
The single page frag cache uses a 1K fragment for such allocation, and the additional overhead, under small UDP packets flood, makes the page allocator a bottleneck.
Thanks to commit bf9f1baa279f ("net: add dedicated kmem_cache for typical/small skb->head"), this revert does not re-introduce the original regression. Actually, in the relevant test on top of this revert, I measure a small but noticeable positive delta, just above noise level.
The revert itself required some additional mangling due to the introduction of the SKB_HEAD_ALIGN() helper and local lock infra in the affected code.
include/linux/netdevice.h +0 -1
@@ -4115,7 +4115,6 @@ void netif_receive_skb_list(struct list_head *head);gro_result_t napi_gro_receive (struct napi_struct *napi,struct sk_buff *skb);void napi_gro_flush (struct napi_struct *napi,bool flush_old);struct sk_buff *napi_get_frags (struct napi_struct *napi); -void napi_get_frags_check (struct napi_struct *napi);gro_result_t napi_gro_frags (struct napi_struct *napi);static inline void napi_free_frags (struct napi_struct *napi)
net/core/dev.c +17 -0
@@ -6920,6 +6920,23 @@ netif_napi_dev_list_add(struct net_device *dev, struct napi_struct *napi)list_add_rcu (&napi->dev_list, higher);/* adds after higher */ } +/* Double check that napi_get_frags() allocates skbs with +* skb->head being backed by slab, not a page fragment. +* This is to make sure bug fixed in 3226b158e67c +* ("net: avoid 32 x truesize under-estimation for tiny skbs") +* does not accidentally come back. +*/ +static void napi_get_frags_check (struct napi_struct *napi) +{ +struct sk_buff *skb; + +local_bh_disable (); + skb =napi_get_frags (napi); +WARN_ON_ONCE (skb && skb->head_frag); +napi_free_frags (napi); +local_bh_enable (); +} + void netif_napi_add_weight_locked(struct net_device *dev, struct napi_struct *napi, int (*poll)(struct napi_struct *, int),
net/core/skbuff.c +5 -98
137 lines not on this page · raw message