mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
mm: introduce bpf_get_root_mem_cgroup() BPF kfunc
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 necessary 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@linux.dev> Link: https://lore.kernel.org/r/20251223044156.208250-4-roman.gushchin@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
5904db9891
commit
5c7db3239c
|
|
@ -10,6 +10,25 @@
|
|||
|
||||
__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()
|
||||
*
|
||||
* Return: A pointer to the root memory cgroup.
|
||||
*/
|
||||
__bpf_kfunc struct mem_cgroup *bpf_get_root_mem_cgroup(void)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return NULL;
|
||||
|
||||
/* 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
|
||||
|
|
@ -64,6 +83,7 @@ __bpf_kfunc void bpf_put_mem_cgroup(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)
|
||||
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)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user