bpf: Reuse freed element in free_by_rcu during allocation
authorHou Tao <houtao1@huawei.com>
Fri, 9 Dec 2022 01:09:46 +0000 (09:09 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 9 Dec 2022 01:50:17 +0000 (17:50 -0800)
commit0893d6007db5cf397f3fc92b2a6935c3ed0c6f00
tree6d85a0755af1269b066db084620002ba8fb065b7
parente60db051a4a70bff151eb59774c64af3a0266794
bpf: Reuse freed element in free_by_rcu during allocation

When there are batched freeing operations on a specific CPU, part of
the freed elements ((high_watermark - lower_watermark) / 2 + 1) will be
indirectly moved into waiting_for_gp list through free_by_rcu list.
After call_rcu_in_progress becomes false again, the remaining elements
in free_by_rcu list will be moved to waiting_for_gp list by the next
invocation of free_bulk(). However if the expiration of RCU tasks trace
grace period is relatively slow, none element in free_by_rcu list will
be moved.

So instead of invoking __alloc_percpu_gfp() or kmalloc_node() to
allocate a new object, in alloc_bulk() just check whether or not there is
freed element in free_by_rcu list and reuse it if available.

Acked-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Hou Tao <houtao1@huawei.com>
Link: https://lore.kernel.org/r/20221209010947.3130477-2-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/memalloc.c