lkml.org 
[lkml]   [2021]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH v2 net-next 1/3] 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 <alobakin@pm.me>
---
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 7626a33cce59..dc3300dc2ac4 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_skb_cache_get(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_skb_cache_get(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

\
 
 \ /
  Last update: 2021-01-13 14:38    [W:0.055 / U:0.024 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site