``` commit ec8e2e1769704b4f69261f36e6aaf035d47c5f0f Author: Roman Gushchin mm: introduce BPF kfuncs to deal with memcg pointers This commit introduces two new BPF kfuncs for converting css pointers to memcg pointers with proper reference counting: bpf_get_mem_cgroup() and bpf_put_mem_cgroup(). > diff --git a/mm/Makefile b/mm/Makefile > index 051e88c69..2d8f9beb3 100644 > --- a/mm/Makefile > +++ b/mm/Makefile > @@ -107,6 +107,7 @@ obj-$(CONFIG_MEMCG) += swap_cgroup.o > endif > ifdef CONFIG_BPF_SYSCALL > obj-y += bpf_oom.o > +obj-$(CONFIG_MEMCG) += bpf_memcontrol.o > endif > obj-$(CONFIG_CGROUP_HUGETLB) += hugetlb_cgroup.o > obj-$(CONFIG_GUP_TEST) += gup_test.o > diff --git a/mm/bpf_memcontrol.c b/mm/bpf_memcontrol.c > new file mode 100644 > index 000000000..1e4609774 > --- /dev/null > +++ b/mm/bpf_memcontrol.c > @@ -0,0 +1,88 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Memory Controller-related BPF kfuncs and auxiliary code > + * > + * Author: Roman Gushchin > + */ > + > +#include > +#include > + > +__bpf_kfunc_start_defs(); > + > +/** > + * bpf_get_mem_cgroup - Get a reference to a memory cgroup > + * @css: pointer to the css structure > + * > + * Returns a pointer to a mem_cgroup structure after bumping > + * the corresponding css's reference counter. > + * > + * It's fine to pass a css which belongs to any cgroup controller, > + * e.g. unified hierarchy's main css. > + * > + * Implements KF_ACQUIRE semantics. > + */ > +__bpf_kfunc struct mem_cgroup * > +bpf_get_mem_cgroup(struct cgroup_subsys_state *css) > +{ > + struct mem_cgroup *memcg = NULL; > + bool rcu_unlock = false; > + > + if (!root_mem_cgroup) > + return NULL; > + > + if (root_mem_cgroup->css.ss != css->ss) { ^^^^^^^ Can this dereference a NULL css pointer? The function checks css for NULL at line 42 with "if (css && css_tryget(css))", which suggests css can be NULL. If a BPF program calls this function with a NULL css, wouldn't it crash here before reaching that check? > + struct cgroup *cgroup = css->cgroup; > + int ssid = root_mem_cgroup->css.ss->id; > + > + rcu_read_lock(); > + rcu_unlock = true; > + css = rcu_dereference_raw(cgroup->subsys[ssid]); > + } > + > + if (css && css_tryget(css)) > + memcg = container_of(css, struct mem_cgroup, css); > + > + if (rcu_unlock) > + rcu_read_unlock(); > + > + return memcg; > +} [ ... ] > +__bpf_kfunc_end_defs(); > + > +BTF_KFUNCS_START(bpf_memcontrol_kfuncs) > +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) > + > +BTF_KFUNCS_END(bpf_memcontrol_kfuncs) [ ... ] ``` --- AI reviewed your patch. Please fix the bug or email reply why it's not a bug. See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md In-Reply-To-Subject: `mm: introduce BPF kfuncs to deal with memcg pointers` CI run summary: https://github.com/kernel-patches/bpf/actions/runs/18859027430