2021-01-11 18:32:10

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH net-next 2/5] skbuff: open-code __build_skb() inside __napi_alloc_skb()

In preparation for skbuff_heads caching and reusing, open-code
__build_skb() inside __napi_alloc_skb() with factoring out
the skbbuff_head allocation itself.
Note that the return value of __build_skb_around() is not checked
since it never returns anything except the given skb.

Signed-off-by: Alexander Lobakin <[email protected]>
---
net/core/skbuff.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 17ae5e90f103..3c904c29efbb 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -485,6 +485,11 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len,
}
EXPORT_SYMBOL(__netdev_alloc_skb);

+static struct sk_buff *__napi_decache_skb(struct napi_alloc_cache *nc)
+{
+ return kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC);
+}
+
/**
* __napi_alloc_skb - allocate skbuff for rx in a specific NAPI instance
* @napi: napi instance this buffer was allocated for
@@ -525,12 +530,15 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
if (unlikely(!data))
return NULL;

- skb = __build_skb(data, len);
+ skb = __napi_decache_skb(nc);
if (unlikely(!skb)) {
skb_free_frag(data);
return NULL;
}

+ memset(skb, 0, offsetof(struct sk_buff, tail));
+ __build_skb_around(skb, data, len);
+
if (nc->page.pfmemalloc)
skb->pfmemalloc = 1;
skb->head_frag = 1;
--
2.30.0