Message ID | 20230202014158.19616-7-laoar.shao@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | bpf, mm: bpf memory usage | expand |
Hi Yafang, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on bpf-next/master] url: https://github.com/intel-lab-lkp/linux/commits/Yafang-Shao/mm-percpu-fix-incorrect-size-in-pcpu_obj_full_size/20230202-094352 base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master patch link: https://lore.kernel.org/r/20230202014158.19616-7-laoar.shao%40gmail.com patch subject: [PATCH bpf-next 6/7] bpf: introduce bpf_mem_alloc_size() config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230202/202302021258.By6JZK71-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/996f3e2ac4dca054396d0f37ffe8ddb97fc4212f git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Yafang-Shao/mm-percpu-fix-incorrect-size-in-pcpu_obj_full_size/20230202-094352 git checkout 996f3e2ac4dca054396d0f37ffe8ddb97fc4212f # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash kernel/bpf/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> kernel/bpf/memalloc.c:227:15: warning: no previous prototype for 'bpf_mem_cache_size' [-Wmissing-prototypes] 227 | unsigned long bpf_mem_cache_size(struct bpf_mem_cache *c, void *obj) | ^~~~~~~~~~~~~~~~~~ vim +/bpf_mem_cache_size +227 kernel/bpf/memalloc.c 226 > 227 unsigned long bpf_mem_cache_size(struct bpf_mem_cache *c, void *obj) 228 { 229 unsigned long size; 230 231 if (!obj) 232 return 0; 233 234 if (c->percpu_size) { 235 size = percpu_size(((void **)obj)[1]); 236 size += ksize(obj); 237 return size; 238 } 239 240 return ksize(obj); 241 } 242
On Thu, Feb 2, 2023 at 12:54 PM kernel test robot <lkp@intel.com> wrote: > > Hi Yafang, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on bpf-next/master] > > url: https://github.com/intel-lab-lkp/linux/commits/Yafang-Shao/mm-percpu-fix-incorrect-size-in-pcpu_obj_full_size/20230202-094352 > base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master > patch link: https://lore.kernel.org/r/20230202014158.19616-7-laoar.shao%40gmail.com > patch subject: [PATCH bpf-next 6/7] bpf: introduce bpf_mem_alloc_size() > config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230202/202302021258.By6JZK71-lkp@intel.com/config) > compiler: m68k-linux-gcc (GCC) 12.1.0 > reproduce (this is a W=1 build): > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # https://github.com/intel-lab-lkp/linux/commit/996f3e2ac4dca054396d0f37ffe8ddb97fc4212f > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Yafang-Shao/mm-percpu-fix-incorrect-size-in-pcpu_obj_full_size/20230202-094352 > git checkout 996f3e2ac4dca054396d0f37ffe8ddb97fc4212f > # save the config file > mkdir build_dir && cp config build_dir/.config > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash kernel/bpf/ > > If you fix the issue, kindly add following tag where applicable > | Reported-by: kernel test robot <lkp@intel.com> > > All warnings (new ones prefixed by >>): > > >> kernel/bpf/memalloc.c:227:15: warning: no previous prototype for 'bpf_mem_cache_size' [-Wmissing-prototypes] > 227 | unsigned long bpf_mem_cache_size(struct bpf_mem_cache *c, void *obj) > | ^~~~~~~~~~~~~~~~~~ Should be defined with 'static'. Thanks for the report. Will update it in the next version. > > > vim +/bpf_mem_cache_size +227 kernel/bpf/memalloc.c > > 226 > > 227 unsigned long bpf_mem_cache_size(struct bpf_mem_cache *c, void *obj) > 228 { > 229 unsigned long size; > 230 > 231 if (!obj) > 232 return 0; > 233 > 234 if (c->percpu_size) { > 235 size = percpu_size(((void **)obj)[1]); > 236 size += ksize(obj); > 237 return size; > 238 } > 239 > 240 return ksize(obj); > 241 } > 242 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests
diff --git a/include/linux/bpf_mem_alloc.h b/include/linux/bpf_mem_alloc.h index 3e164b8..86d8dcf 100644 --- a/include/linux/bpf_mem_alloc.h +++ b/include/linux/bpf_mem_alloc.h @@ -24,5 +24,7 @@ struct bpf_mem_alloc { /* kmem_cache_alloc/free equivalent: */ void *bpf_mem_cache_alloc(struct bpf_mem_alloc *ma); void bpf_mem_cache_free(struct bpf_mem_alloc *ma, void *ptr); +unsigned long bpf_mem_alloc_size(struct bpf_mem_alloc *ma); +unsigned long bpf_mem_cache_elem_size(struct bpf_mem_alloc *ma, void *ptr); #endif /* _BPF_MEM_ALLOC_H */ diff --git a/kernel/bpf/memalloc.c b/kernel/bpf/memalloc.c index ebcc3dd..ebf8964 100644 --- a/kernel/bpf/memalloc.c +++ b/kernel/bpf/memalloc.c @@ -224,6 +224,22 @@ static void free_one(struct bpf_mem_cache *c, void *obj) kfree(obj); } +unsigned long bpf_mem_cache_size(struct bpf_mem_cache *c, void *obj) +{ + unsigned long size; + + if (!obj) + return 0; + + if (c->percpu_size) { + size = percpu_size(((void **)obj)[1]); + size += ksize(obj); + return size; + } + + return ksize(obj); +} + static void __free_rcu(struct rcu_head *head) { struct bpf_mem_cache *c = container_of(head, struct bpf_mem_cache, rcu); @@ -559,6 +575,41 @@ void bpf_mem_alloc_destroy(struct bpf_mem_alloc *ma) } } +/* We only account the elements on free list */ +static unsigned long bpf_mem_cache_free_size(struct bpf_mem_cache *c) +{ + return c->unit_size * c->free_cnt; +} + +/* Get the free list size of a bpf_mem_alloc pool. */ +unsigned long bpf_mem_alloc_size(struct bpf_mem_alloc *ma) +{ + struct bpf_mem_caches *cc; + struct bpf_mem_cache *c; + unsigned long size = 0; + int cpu, i; + + if (ma->cache) { + for_each_possible_cpu(cpu) { + c = per_cpu_ptr(ma->cache, cpu); + size += bpf_mem_cache_free_size(c); + } + size += percpu_size(ma->cache); + } + if (ma->caches) { + for_each_possible_cpu(cpu) { + cc = per_cpu_ptr(ma->caches, cpu); + for (i = 0; i < NUM_CACHES; i++) { + c = &cc->cache[i]; + size += bpf_mem_cache_free_size(c); + } + } + size += percpu_size(ma->caches); + } + + return size; +} + /* notrace is necessary here and in other functions to make sure * bpf programs cannot attach to them and cause llist corruptions. */ @@ -675,3 +726,22 @@ void notrace bpf_mem_cache_free(struct bpf_mem_alloc *ma, void *ptr) unit_free(this_cpu_ptr(ma->cache), ptr); } + +/* Get elemet size from the element pointer @ptr */ +unsigned long notrace bpf_mem_cache_elem_size(struct bpf_mem_alloc *ma, void *ptr) +{ + struct llist_node *llnode; + struct bpf_mem_cache *c; + unsigned long size; + + if (!ptr) + return 0; + + llnode = ptr - LLIST_NODE_SZ; + migrate_disable(); + c = this_cpu_ptr(ma->cache); + size = bpf_mem_cache_size(c, llnode); + migrate_enable(); + + return size; +}
Introduce helpers to get the memory usage of bpf_mem_alloc, includes the bpf_mem_alloc pool and the in-use elements size. Note that we only count the free list size in the bpf_mem_alloc pool but don't count other lists, because there won't be too many elements on other lists. Ignoring other lists could make the code simple. Signed-off-by: Yafang Shao <laoar.shao@gmail.com> --- include/linux/bpf_mem_alloc.h | 2 ++ kernel/bpf/memalloc.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)