Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> writes: > On Mon, 18 Aug 2025 at 19:02, Roman Gushchin <roman.gushchin@xxxxxxxxx> wrote: >> >> Introduce a bpf kfunc to get a trusted pointer to the root memory >> cgroup. It's very handy to traverse the full memcg tree, e.g. >> for handling a system-wide OOM. >> >> It's possible to obtain this pointer by traversing the memcg tree >> up from any known memcg, but it's sub-optimal and makes bpf programs >> more complex and less efficient. >> >> bpf_get_root_mem_cgroup() has a KF_ACQUIRE | KF_RET_NULL semantics, >> however in reality it's not necessarily to bump the corresponding >> reference counter - root memory cgroup is immortal, reference counting >> is skipped, see css_get(). Once set, root_mem_cgroup is always a valid >> memcg pointer. It's safe to call bpf_put_mem_cgroup() for the pointer >> obtained with bpf_get_root_mem_cgroup(), it's effectively a no-op. >> >> Signed-off-by: Roman Gushchin <roman.gushchin@xxxxxxxxx> >> --- >> mm/bpf_memcontrol.c | 15 +++++++++++++++ >> 1 file changed, 15 insertions(+) >> >> diff --git a/mm/bpf_memcontrol.c b/mm/bpf_memcontrol.c >> index 66f2a359af7e..a8faa561bcba 100644 >> --- a/mm/bpf_memcontrol.c >> +++ b/mm/bpf_memcontrol.c >> @@ -10,6 +10,20 @@ >> >> __bpf_kfunc_start_defs(); >> >> +/** >> + * bpf_get_root_mem_cgroup - Returns a pointer to the root memory cgroup >> + * >> + * 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() >> + */ >> +__bpf_kfunc struct mem_cgroup *bpf_get_root_mem_cgroup(void) >> +{ >> + /* css_get() is not needed */ >> + return root_mem_cgroup; >> +} >> + >> /** >> * bpf_get_mem_cgroup - Get a reference to a memory cgroup >> * @css: pointer to the css structure >> @@ -122,6 +136,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_ACQUIRE | KF_RET_NULL) > > Same suggestion here (re: trusted args). It's not really taking any arguments, so I don't think it's applicable: struct mem_cgroup *bpf_get_root_mem_cgroup(void)