On 12/22/2023 11:17 AM, Yonghong Song wrote: > Commit 41a5db8d8161 ("Add support for non-fix-size percpu mem allocation") > added support for non-fix-size percpu memory allocation. > Such allocation will allocate percpu memory for all buckets on all > cpus and the memory consumption is in the order to quadratic. > For example, let us say, 4 cpus, unit size 16 bytes, so each > cpu has 16 * 4 = 64 bytes, with 4 cpus, total will be 64 * 4 = 256 bytes. > Then let us say, 8 cpus with the same unit size, each cpu > has 16 * 8 = 128 bytes, with 8 cpus, total will be 128 * 8 = 1024 bytes. > So if the number of cpus doubles, the number of memory consumption > will be 4 times. So for a system with large number of cpus, the > memory consumption goes up quickly with quadratic order. > For example, for 4KB percpu allocation, 128 cpus. The total memory > consumption will 4KB * 128 * 128 = 64MB. Things will become > worse if the number of cpus is bigger (e.g., 512, 1024, etc.) > > In Commit 41a5db8d8161, the non-fix-size percpu memory allocation is > done in boot time, so for system with large number of cpus, the initial > percpu memory consumption is very visible. For example, for 128 cpu > system, the total percpu memory allocation will be at least > (16 + 32 + 64 + 96 + 128 + 196 + 256 + 512 + 1024 + 2048 + 4096) > * 128 * 128 = ~138MB. > which is pretty big. It will be even bigger for larger number of cpus. > > Note that the current prefill also allocates 4 entries if the unit size > is less than 256. So on top of 138MB memory consumption, this will > add more consumption with > 3 * (16 + 32 + 64 + 96 + 128 + 196 + 256) * 128 * 128 = ~38MB. > Next patch will try to reduce this memory consumption. > > Later on, Commit 1fda5bb66ad8 ("bpf: Do not allocate percpu memory > at init stage") moved the non-fix-size percpu memory allocation > to bpf verificaiton stage. Once a particular bpf_percpu_obj_new() > is called by bpf program, the memory allocator will try to fill in > the cache with all sizes, causing the same amount of percpu memory > consumption as in the boot stage. > > To reduce the initial percpu memory consumption for non-fix-size > percpu memory allocation, instead of filling the cache with all > supported allocation sizes, this patch intends to fill the cache > only for the requested size. As typically users will not use large > percpu data structure, this can save memory significantly. > For example, the allocation size is 64 bytes with 128 cpus. > Then total percpu memory amount will be 64 * 128 * 128 = 1MB, > much less than previous 138MB. > > Signed-off-by: Yonghong Song <yonghong.song@xxxxxxxxx> Acked-by: Hou Tao <houtao1@xxxxxxxxxx>