bpf: Avoid unnecessary extra percpu memory allocation
authorYonghong Song <yonghong.song@linux.dev>
Fri, 22 Dec 2023 03:17:34 +0000 (19:17 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 4 Jan 2024 05:08:25 +0000 (21:08 -0800)
Currently, for percpu memory allocation, say if the user
requests allocation size to be 32 bytes, the actually
calculated size will be 40 bytes and it further rounds
to 64 bytes, and eventually 64 bytes are allocated,
wasting 32-byte memory.

Change bpf_mem_alloc() to calculate the cache index
based on the user-provided allocation size so unnecessary
extra memory can be avoided.

Suggested-by: Hou Tao <houtao1@huawei.com>
Acked-by: Hou Tao <houtao1@huawei.com>
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20231222031734.1288400-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/memalloc.c

index aa0fbf000a12b36062c39656291431848e82ab1d..288ec4a967d08f5d62602ca12a9d82a2cc225f2b 100644 (file)
@@ -833,7 +833,9 @@ void notrace *bpf_mem_alloc(struct bpf_mem_alloc *ma, size_t size)
        if (!size)
                return NULL;
 
-       idx = bpf_mem_cache_idx(size + LLIST_NODE_SZ);
+       if (!ma->percpu)
+               size += LLIST_NODE_SZ;
+       idx = bpf_mem_cache_idx(size);
        if (idx < 0)
                return NULL;