mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Revert "net: skb: introduce and use a single page frag cache"
After the previous commit is finally safe to revert commitdbae2b0628("net: skb: introduce and use a single page frag cache"): do it here. The intended goal of such change was to counter a performance regression introduced by commit3226b158e6("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 commitbf9f1baa27("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 recent updates in the affected code. Suggested-by: Eric Dumazet <edumazet@google.com> Fixes:dbae2b0628("net: skb: introduce and use a single page frag cache") Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -6991,6 +6991,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),
|
||||
|
||||
Reference in New Issue
Block a user