From: Hou Tao <houtao1@xxxxxxxxxx> Add bpf_mem_cache_is_mergeable() to check whether two bpf mem allocator for fixed-size objects are mergeable or not. The merging could reduce the memory overhead of bpf mem allocator. Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> --- include/linux/bpf_mem_alloc.h | 1 + kernel/bpf/memalloc.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/include/linux/bpf_mem_alloc.h b/include/linux/bpf_mem_alloc.h index e45162ef59bb..faa54b9c7a04 100644 --- a/include/linux/bpf_mem_alloc.h +++ b/include/linux/bpf_mem_alloc.h @@ -47,5 +47,6 @@ void bpf_mem_cache_free(struct bpf_mem_alloc *ma, void *ptr); void bpf_mem_cache_free_rcu(struct bpf_mem_alloc *ma, void *ptr); void bpf_mem_cache_raw_free(void *ptr); void *bpf_mem_cache_alloc_flags(struct bpf_mem_alloc *ma, gfp_t flags); +bool bpf_mem_cache_is_mergeable(size_t size, size_t new_size, bool percpu); #endif /* _BPF_MEM_ALLOC_H */ diff --git a/kernel/bpf/memalloc.c b/kernel/bpf/memalloc.c index 889374722d0a..49dd08ad1d4f 100644 --- a/kernel/bpf/memalloc.c +++ b/kernel/bpf/memalloc.c @@ -1014,3 +1014,15 @@ int bpf_mem_alloc_check_size(bool percpu, size_t size) return 0; } + +bool bpf_mem_cache_is_mergeable(size_t size, size_t new_size, bool percpu) +{ + /* Only for fixed-size object allocator */ + if (!size || !new_size) + return false; + + return (percpu && ALIGN(size, PCPU_MIN_ALLOC_SIZE) == + ALIGN(new_size, PCPU_MIN_ALLOC_SIZE)) || + (!percpu && kmalloc_size_roundup(size + LLIST_NODE_SZ) == + kmalloc_size_roundup(new_size + LLIST_NODE_SZ)); +} -- 2.29.2