diff mbox

[net-next,07/11] net: introduce napi_alloc_skb_hint() for more use-cases

Message ID 20160202211314.16315.70164.stgit@firesoul
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Jesper Dangaard Brouer Feb. 2, 2016, 9:13 p.m. UTC
The default bulk alloc size arbitrarily choosen (to be 8) might
not suit all use-cases, this introduce a function napi_alloc_skb_hint()
that allow the caller to specify a bulk size hint they are expecting.
It is a hint because __napi_alloc_skb() limits the bulk size to
the array size.

One user is the mlx5 driver, which bulk re-populate it's RX ring
with both SKBs and pages.  Thus, it would like to work with
bigger bulk alloc chunks.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
---
 include/linux/skbuff.h |   19 +++++++++++++++----
 net/core/skbuff.c      |    8 +++-----
 2 files changed, 18 insertions(+), 9 deletions(-)

Comments

kernel test robot Feb. 2, 2016, 10:29 p.m. UTC | #1
Hi Jesper,

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Jesper-Dangaard-Brouer/net-mitigating-kmem_cache-slowpath-and-BoF-discussion-patches/20160203-051706
reproduce: make htmldocs

All warnings (new ones prefixed by >>):

   include/linux/skbuff.h:922: warning: No description found for parameter 'sk'
>> net/core/skbuff.c:482: warning: No description found for parameter 'bulk_hint'
   net/core/gen_stats.c:155: warning: No description found for parameter 'cpu'
   net/core/gen_estimator.c:212: warning: No description found for parameter 'cpu_bstats'
   net/core/gen_estimator.c:303: warning: No description found for parameter 'cpu_bstats'
   net/core/dev.c:6450: warning: No description found for parameter 'len'
   include/linux/netdevice.h:1321: warning: Enum value 'IFF_XMIT_DST_RELEASE_PERM' not described in enum 'netdev_priv_flags'
   include/linux/netdevice.h:1321: warning: Enum value 'IFF_IPVLAN_MASTER' not described in enum 'netdev_priv_flags'
   include/linux/netdevice.h:1321: warning: Enum value 'IFF_IPVLAN_SLAVE' not described in enum 'netdev_priv_flags'
   include/linux/netdevice.h:1826: warning: No description found for parameter 'ptype_all'
   include/linux/netdevice.h:1826: warning: No description found for parameter 'ptype_specific'

vim +/bulk_hint +482 net/core/skbuff.c

^1da177e Linus Torvalds         2005-04-16  466  
fd11a83d Alexander Duyck        2014-12-09  467  /**
fd11a83d Alexander Duyck        2014-12-09  468   *	__napi_alloc_skb - allocate skbuff for rx in a specific NAPI instance
fd11a83d Alexander Duyck        2014-12-09  469   *	@napi: napi instance this buffer was allocated for
d7499160 Masanari Iida          2015-08-24  470   *	@len: length to allocate
fd11a83d Alexander Duyck        2014-12-09  471   *	@gfp_mask: get_free_pages mask, passed to alloc_skb and alloc_pages
fd11a83d Alexander Duyck        2014-12-09  472   *
fd11a83d Alexander Duyck        2014-12-09  473   *	Allocate a new sk_buff for use in NAPI receive.  This buffer will
fd11a83d Alexander Duyck        2014-12-09  474   *	attempt to allocate the head from a special reserved region used
fd11a83d Alexander Duyck        2014-12-09  475   *	only for NAPI Rx allocation.  By doing this we can save several
fd11a83d Alexander Duyck        2014-12-09  476   *	CPU cycles by avoiding having to disable and re-enable IRQs.
fd11a83d Alexander Duyck        2014-12-09  477   *
fd11a83d Alexander Duyck        2014-12-09  478   *	%NULL is returned if there is no free memory.
fd11a83d Alexander Duyck        2014-12-09  479   */
9451980a Alexander Duyck        2015-05-06  480  struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
c24f01ac Jesper Dangaard Brouer 2016-02-02  481  				 unsigned int bulk_hint, gfp_t gfp_mask)
fd11a83d Alexander Duyck        2014-12-09 @482  {
1ec46e92 Jesper Dangaard Brouer 2016-02-02  483  	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
c24f01ac Jesper Dangaard Brouer 2016-02-02  484  	unsigned int bulk_sz = min(bulk_hint, NAPI_SKB_CACHE_SIZE);
fc755a89 Jesper Dangaard Brouer 2016-02-02  485  	struct skb_shared_info *shinfo;
fd11a83d Alexander Duyck        2014-12-09  486  	struct sk_buff *skb;
9451980a Alexander Duyck        2015-05-06  487  	void *data;
fd11a83d Alexander Duyck        2014-12-09  488  
9451980a Alexander Duyck        2015-05-06  489  	len += NET_SKB_PAD + NET_IP_ALIGN;
9451980a Alexander Duyck        2015-05-06  490  

:::::: The code at line 482 was first introduced by commit
:::::: fd11a83dd3630ec6a60f8a702446532c5c7e1991 net: Pull out core bits of __netdev_alloc_skb and add __napi_alloc_skb

:::::: TO: Alexander Duyck <alexander.h.duyck@redhat.com>
:::::: CC: David S. Miller <davem@davemloft.net>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index b06ba2e07c89..4d0c0eacbc34 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2391,14 +2391,25 @@  static inline void skb_free_frag(void *addr)
 	__free_page_frag(addr);
 }
 
+#define NAPI_SKB_CACHE_SIZE	64U /* Used in struct napi_alloc_cache */
+#define NAPI_SKB_BULK_ALLOC	 8U /* Default slab bulk alloc in NAPI */
+
 void *napi_alloc_frag(unsigned int fragsz);
-struct sk_buff *__napi_alloc_skb(struct napi_struct *napi,
-				 unsigned int length, gfp_t gfp_mask);
+struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
+				 unsigned int bulk_hint, gfp_t gfp_mask);
 static inline struct sk_buff *napi_alloc_skb(struct napi_struct *napi,
-					     unsigned int length)
+					     unsigned int len)
+{
+	return __napi_alloc_skb(napi, len, NAPI_SKB_BULK_ALLOC, GFP_ATOMIC);
+}
+static inline struct sk_buff *napi_alloc_skb_hint(struct napi_struct *napi,
+						  unsigned int len,
+						  unsigned int bulk_hint)
 {
-	return __napi_alloc_skb(napi, length, GFP_ATOMIC);
+	bulk_hint = bulk_hint ? : 1;
+	return __napi_alloc_skb(napi, len, bulk_hint, GFP_ATOMIC);
 }
+
 void napi_consume_skb(struct sk_buff *skb, int budget);
 
 void __kfree_skb_flush(void);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index ae8cdbec90ee..f77209fb5361 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -347,8 +347,6 @@  struct sk_buff *build_skb(void *data, unsigned int frag_size)
 }
 EXPORT_SYMBOL(build_skb);
 
-#define NAPI_SKB_CACHE_SIZE	64
-
 struct napi_alloc_cache {
 	struct page_frag_cache page;
 	size_t skb_count;
@@ -480,9 +478,10 @@  EXPORT_SYMBOL(__netdev_alloc_skb);
  *	%NULL is returned if there is no free memory.
  */
 struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
-				 gfp_t gfp_mask)
+				 unsigned int bulk_hint, gfp_t gfp_mask)
 {
 	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
+	unsigned int bulk_sz = min(bulk_hint, NAPI_SKB_CACHE_SIZE);
 	struct skb_shared_info *shinfo;
 	struct sk_buff *skb;
 	void *data;
@@ -507,10 +506,9 @@  struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
 	if (unlikely(!data))
 		return NULL;
 
-#define BULK_ALLOC_SIZE 8
 	if (!nc->skb_count) {
 		nc->skb_count = kmem_cache_alloc_bulk(skbuff_head_cache,
-						      gfp_mask, BULK_ALLOC_SIZE,
+						      gfp_mask, bulk_sz,
 						      nc->skb_cache);
 	}
 	if (likely(nc->skb_count)) {