Message ID | 20241217105659.2215649-1-yajun.deng@linux.dev (mailing list archive) |
---|---|
State | Rejected |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] sock: make SKB_FRAG_PAGE_ORDER equal to PAGE_ALLOC_COSTLY_ORDER | expand |
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.
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
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
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 |
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(-)