[PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER

Yajun Deng posted 1 patch 1 year ago
include/net/sock.h | 2 +-
net/core/sock.c    | 3 +--
2 files changed, 2 insertions(+), 3 deletions(-)
[PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
Posted by Yajun Deng 1 year ago
The SKB_FRAG_PAGE_ORDER will be 3 if PAGE_SIZE is 4096, and less than 3
if it is not. So it will increase the number of memory allocations if
PAGE_SIZE is greater than 4096.

alloc_pages() only relates to the order, if an order is less than or equal
to PAGE_ALLOC_COSTLY_ORDER, it will get the page from rmqueue_pcplist() in
rmqueue(). So there's no need for the order to be less than
PAGE_ALLOC_COSTLY_ORDER.

To decrease the number of memory allocations, make SKB_FRAG_PAGE_ORDER
equal to PAGE_ALLOC_COSTLY_ORDER even if PAGE_SIZE isn't 4096.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
---
 include/net/sock.h | 2 +-
 net/core/sock.c    | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/include/net/sock.h b/include/net/sock.h
index 7464e9f9f47c..a33645226577 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -2853,7 +2853,7 @@ extern __u32 sysctl_rmem_max;
 extern __u32 sysctl_wmem_default;
 extern __u32 sysctl_rmem_default;
 
-#define SKB_FRAG_PAGE_ORDER	get_order(32768)
+#define SKB_FRAG_PAGE_ORDER	PAGE_ALLOC_COSTLY_ORDER
 DECLARE_STATIC_KEY_FALSE(net_high_order_alloc_disable_key);
 
 static inline int sk_get_wmem0(const struct sock *sk, const struct proto *proto)
diff --git a/net/core/sock.c b/net/core/sock.c
index 74729d20cd00..0db306f4216c 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -3014,8 +3014,7 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
 	}
 
 	pfrag->offset = 0;
-	if (SKB_FRAG_PAGE_ORDER &&
-	    !static_branch_unlikely(&net_high_order_alloc_disable_key)) {
+	if (!static_branch_unlikely(&net_high_order_alloc_disable_key)) {
 		/* Avoid direct reclaim but allow kswapd to wake */
 		pfrag->page = alloc_pages((gfp & ~__GFP_DIRECT_RECLAIM) |
 					  __GFP_COMP | __GFP_NOWARN |
-- 
2.25.1
Re: [PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
Posted by kernel test robot 12 months ago
Hi Yajun,

kernel test robot noticed the following build warnings:

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

url:    https://github.com/intel-lab-lkp/linux/commits/Yajun-Deng/sock-make-SKB_FRAG_PAGE_ORDER-equal-to-PAGE_ALLOC_COSTLY_ORDER/20241217-185748
base:   net-next/main
patch link:    https://lore.kernel.org/r/20241217105659.2215649-1-yajun.deng%40linux.dev
patch subject: [PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
config: openrisc-randconfig-r122-20241220 (https://download.01.org/0day-ci/archive/20241221/202412210700.fAOJ9ocm-lkp@intel.com/config)
compiler: or1k-linux-gcc (GCC) 14.2.0
reproduce: (https://download.01.org/0day-ci/archive/20241221/202412210700.fAOJ9ocm-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412210700.fAOJ9ocm-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   net/core/sock.c:2496:9: sparse: sparse: context imbalance in 'sk_clone_lock' - wrong count at exit
   net/core/sock.c:2500:6: sparse: sparse: context imbalance in 'sk_free_unlock_clone' - unexpected unlock
>> net/core/sock.c:3044:49: sparse: sparse: cast truncates bits from constant value (10000 becomes 0)

vim +3044 net/core/sock.c

5640f7685831e08 Eric Dumazet 2012-09-23  3013  
400dfd3ae899849 Eric Dumazet 2013-10-17  3014  /**
400dfd3ae899849 Eric Dumazet 2013-10-17  3015   * skb_page_frag_refill - check that a page_frag contains enough room
400dfd3ae899849 Eric Dumazet 2013-10-17  3016   * @sz: minimum size of the fragment we want to get
400dfd3ae899849 Eric Dumazet 2013-10-17  3017   * @pfrag: pointer to page_frag
82d5e2b8b466d5b Eric Dumazet 2014-09-08  3018   * @gfp: priority for memory allocation
400dfd3ae899849 Eric Dumazet 2013-10-17  3019   *
400dfd3ae899849 Eric Dumazet 2013-10-17  3020   * Note: While this allocator tries to use high order pages, there is
400dfd3ae899849 Eric Dumazet 2013-10-17  3021   * no guarantee that allocations succeed. Therefore, @sz MUST be
400dfd3ae899849 Eric Dumazet 2013-10-17  3022   * less or equal than PAGE_SIZE.
400dfd3ae899849 Eric Dumazet 2013-10-17  3023   */
d9b2938aabf757d Eric Dumazet 2014-08-27  3024  bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
5640f7685831e08 Eric Dumazet 2012-09-23  3025  {
5640f7685831e08 Eric Dumazet 2012-09-23  3026  	if (pfrag->page) {
fe896d1878949ea Joonsoo Kim  2016-03-17  3027  		if (page_ref_count(pfrag->page) == 1) {
5640f7685831e08 Eric Dumazet 2012-09-23  3028  			pfrag->offset = 0;
5640f7685831e08 Eric Dumazet 2012-09-23  3029  			return true;
5640f7685831e08 Eric Dumazet 2012-09-23  3030  		}
400dfd3ae899849 Eric Dumazet 2013-10-17  3031  		if (pfrag->offset + sz <= pfrag->size)
5640f7685831e08 Eric Dumazet 2012-09-23  3032  			return true;
5640f7685831e08 Eric Dumazet 2012-09-23  3033  		put_page(pfrag->page);
5640f7685831e08 Eric Dumazet 2012-09-23  3034  	}
5640f7685831e08 Eric Dumazet 2012-09-23  3035  
5640f7685831e08 Eric Dumazet 2012-09-23  3036  	pfrag->offset = 0;
af87ed7a96a9372 Yajun Deng   2024-12-17  3037  	if (!static_branch_unlikely(&net_high_order_alloc_disable_key)) {
d0164adc89f6bb3 Mel Gorman   2015-11-06  3038  		/* Avoid direct reclaim but allow kswapd to wake */
d0164adc89f6bb3 Mel Gorman   2015-11-06  3039  		pfrag->page = alloc_pages((gfp & ~__GFP_DIRECT_RECLAIM) |
d0164adc89f6bb3 Mel Gorman   2015-11-06  3040  					  __GFP_COMP | __GFP_NOWARN |
d0164adc89f6bb3 Mel Gorman   2015-11-06  3041  					  __GFP_NORETRY,
d9b2938aabf757d Eric Dumazet 2014-08-27  3042  					  SKB_FRAG_PAGE_ORDER);
d9b2938aabf757d Eric Dumazet 2014-08-27  3043  		if (likely(pfrag->page)) {
d9b2938aabf757d Eric Dumazet 2014-08-27 @3044  			pfrag->size = PAGE_SIZE << SKB_FRAG_PAGE_ORDER;
d9b2938aabf757d Eric Dumazet 2014-08-27  3045  			return true;
d9b2938aabf757d Eric Dumazet 2014-08-27  3046  		}
d9b2938aabf757d Eric Dumazet 2014-08-27  3047  	}
d9b2938aabf757d Eric Dumazet 2014-08-27  3048  	pfrag->page = alloc_page(gfp);
d9b2938aabf757d Eric Dumazet 2014-08-27  3049  	if (likely(pfrag->page)) {
d9b2938aabf757d Eric Dumazet 2014-08-27  3050  		pfrag->size = PAGE_SIZE;
5640f7685831e08 Eric Dumazet 2012-09-23  3051  		return true;
5640f7685831e08 Eric Dumazet 2012-09-23  3052  	}
400dfd3ae899849 Eric Dumazet 2013-10-17  3053  	return false;
400dfd3ae899849 Eric Dumazet 2013-10-17  3054  }
400dfd3ae899849 Eric Dumazet 2013-10-17  3055  EXPORT_SYMBOL(skb_page_frag_refill);
400dfd3ae899849 Eric Dumazet 2013-10-17  3056  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
Posted by kernel test robot 12 months ago
Hi Yajun,

kernel test robot noticed the following build warnings:

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

url:    https://github.com/intel-lab-lkp/linux/commits/Yajun-Deng/sock-make-SKB_FRAG_PAGE_ORDER-equal-to-PAGE_ALLOC_COSTLY_ORDER/20241217-185748
base:   net-next/main
patch link:    https://lore.kernel.org/r/20241217105659.2215649-1-yajun.deng%40linux.dev
patch subject: [PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
config: openrisc-defconfig (https://download.01.org/0day-ci/archive/20241220/202412202122.04V0tnNx-lkp@intel.com/config)
compiler: or1k-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241220/202412202122.04V0tnNx-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412202122.04V0tnNx-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from arch/openrisc/include/asm/page.h:18,
                    from arch/openrisc/include/asm/processor.h:19,
                    from arch/openrisc/include/asm/thread_info.h:22,
                    from include/linux/thread_info.h:60,
                    from include/asm-generic/preempt.h:5,
                    from ./arch/openrisc/include/generated/asm/preempt.h:1,
                    from include/linux/preempt.h:79,
                    from include/linux/spinlock.h:56,
                    from include/linux/wait.h:9,
                    from include/linux/wait_bit.h:8,
                    from include/linux/fs.h:6,
                    from include/linux/highmem.h:5,
                    from include/linux/bvec.h:10,
                    from include/linux/skbuff.h:17,
                    from include/linux/ip.h:16,
                    from include/net/ip.h:22,
                    from include/linux/errqueue.h:6,
                    from net/core/sock.c:91:
   net/core/sock.c: In function 'skb_page_frag_refill':
>> include/vdso/page.h:15:25: warning: conversion from 'long unsigned int' to '__u16' {aka 'short unsigned int'} changes value from '65536' to '0' [-Woverflow]
      15 | #define PAGE_SIZE       (_AC(1,UL) << CONFIG_PAGE_SHIFT)
         |                         ^
   net/core/sock.c:3044:39: note: in expansion of macro 'PAGE_SIZE'
    3044 |                         pfrag->size = PAGE_SIZE << SKB_FRAG_PAGE_ORDER;
         |                                       ^~~~~~~~~


vim +15 include/vdso/page.h

efe8419ae78d65 Vincenzo Frascino 2024-10-14  14  
efe8419ae78d65 Vincenzo Frascino 2024-10-14 @15  #define PAGE_SIZE	(_AC(1,UL) << CONFIG_PAGE_SHIFT)
efe8419ae78d65 Vincenzo Frascino 2024-10-14  16  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER
Posted by Eric Dumazet 1 year ago
On Tue, Dec 17, 2024 at 11:56 AM Yajun Deng <yajun.deng@linux.dev> wrote:
>
> The SKB_FRAG_PAGE_ORDER will be 3 if PAGE_SIZE is 4096, and less than 3
> if it is not. So it will increase the number of memory allocations if
> PAGE_SIZE is greater than 4096.
>
> alloc_pages() only relates to the order, if an order is less than or equal
> to PAGE_ALLOC_COSTLY_ORDER, it will get the page from rmqueue_pcplist() in
> rmqueue(). So there's no need for the order to be less than
> PAGE_ALLOC_COSTLY_ORDER.
>
> To decrease the number of memory allocations, make SKB_FRAG_PAGE_ORDER
> equal to PAGE_ALLOC_COSTLY_ORDER even if PAGE_SIZE isn't 4096.
>
> Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
> ---
>  include/net/sock.h | 2 +-
>  net/core/sock.c    | 3 +--
>  2 files changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/sock.h b/include/net/sock.h
> index 7464e9f9f47c..a33645226577 100644
> --- a/include/net/sock.h
> +++ b/include/net/sock.h
> @@ -2853,7 +2853,7 @@ extern __u32 sysctl_rmem_max;
>  extern __u32 sysctl_wmem_default;
>  extern __u32 sysctl_rmem_default;
>
> -#define SKB_FRAG_PAGE_ORDER    get_order(32768)

We do not want to allow some programs to work on arches with 64K page
sizes, and not work on 4K page sizes.

Please post your precise use case.