mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-21 23:16:50 +08:00
bpf: Revert "bpf: drop KF_ACQUIRE flag on BPF kfunc bpf_get_root_mem_cgroup()"
This reverts commit e463b6de9d ("bpf: drop KF_ACQUIRE flag on BPF
kfunc bpf_get_root_mem_cgroup()").
The original commit removed the KF_ACQUIRE flag from
bpf_get_root_mem_cgroup() under the assumption that it resulted in
simplified usage. This stemmed from the fact that
bpf_get_root_mem_cgroup() inherently returns a reference to an object
which technically isn't reference counted, therefore there is no
strong requirement to call a matching bpf_put_mem_cgroup() on the
returned reference.
Although technically correct, as per the arguments in the thread [0],
dropping the KF_ACQUIRE flag and losing reference tracking semantics
negatively impacted the usability of bpf_get_root_mem_cgroup() in
practice.
[0] https://lore.kernel.org/bpf/878qdx6yut.fsf@linux.dev/
Link: https://lore.kernel.org/bpf/CAADnVQ+6d1Lj4dteAv8u62d7kj3Ze5io6bqM0xeQd-UPk9ZgJQ@mail.gmail.com/
Signed-off-by: Matt Bobrowski <mattbobrowski@google.com>
Link: https://lore.kernel.org/r/20260121090001.240166-1-mattbobrowski@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
ca674a032f
commit
d0f5d4f8f3
@@ -13,12 +13,12 @@ __bpf_kfunc_start_defs();
|
||||
/**
|
||||
* bpf_get_root_mem_cgroup - Returns a pointer to the root memory cgroup
|
||||
*
|
||||
* Return: A pointer to the root memory cgroup. Notably, the pointer to the
|
||||
* returned struct mem_cgroup is trusted by default, so it's perfectably
|
||||
* acceptable to also pass this pointer into other BPF kfuncs (e.g.,
|
||||
* bpf_mem_cgroup_usage()). Additionally, this BPF kfunc does not make use of
|
||||
* KF_ACQUIRE semantics, so there's no requirement for the BPF program to call
|
||||
* bpf_put_mem_cgroup() on the pointer returned by this BPF kfunc.
|
||||
* The function has KF_ACQUIRE semantics, even though the root memory
|
||||
* cgroup is never destroyed after being created and doesn't require
|
||||
* reference counting. And it's perfectly safe to pass it to
|
||||
* bpf_put_mem_cgroup()
|
||||
*
|
||||
* Return: A pointer to the root memory cgroup.
|
||||
*/
|
||||
__bpf_kfunc struct mem_cgroup *bpf_get_root_mem_cgroup(void)
|
||||
{
|
||||
@@ -162,7 +162,7 @@ __bpf_kfunc void bpf_mem_cgroup_flush_stats(struct mem_cgroup *memcg)
|
||||
__bpf_kfunc_end_defs();
|
||||
|
||||
BTF_KFUNCS_START(bpf_memcontrol_kfuncs)
|
||||
BTF_ID_FLAGS(func, bpf_get_root_mem_cgroup, KF_RET_NULL)
|
||||
BTF_ID_FLAGS(func, bpf_get_root_mem_cgroup, KF_ACQUIRE | KF_RET_NULL)
|
||||
BTF_ID_FLAGS(func, bpf_get_mem_cgroup, KF_ACQUIRE | KF_RET_NULL | KF_RCU)
|
||||
BTF_ID_FLAGS(func, bpf_put_mem_cgroup, KF_RELEASE)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user