On Thu, Aug 11, 2022 at 11:47 PM Shakeel Butt <shakeelb@xxxxxxxxxx> wrote: > > On Thu, Aug 11, 2022 at 10:49:13AM +0800, Yafang Shao wrote: > > On Thu, Aug 11, 2022 at 1:07 AM Shakeel Butt <shakeelb@xxxxxxxxxx> wrote: > > > > > > On Wed, Aug 10, 2022 at 03:18:30PM +0000, Yafang Shao wrote: > > > > The memcg may be the root_mem_cgroup, in which case we shouldn't put it. > > > > > > No, it is ok to put root_mem_cgroup. css_put already handles the root > > > cgroups. > > > > > > > Ah, this commit log doesn't describe the issue clearly. I should improve it. > > The issue is that in bpf_map_get_memcg() it doesn't get the objcg if > > map->objcg is NULL (that can happen if the map belongs to the root > > memcg), so we shouldn't put the objcg if map->objcg is NULL neither in > > bpf_map_put_memcg(). > > Sorry I am still not understanding. We are not 'getting' objcg in > bpf_map_get_memcg(). We are 'getting' memcg from map->objcg and if that > is NULL the function is returning root memcg and putting root memcg is > totally fine. When the map belongs to root_mem_cgroup, the map->objcg is NULL, right ? See also bpf_map_save_memcg() and it describes clearly in the comment - static void bpf_map_save_memcg(struct bpf_map *map) { /* Currently if a map is created by a process belonging to the root * memory cgroup, get_obj_cgroup_from_current() will return NULL. * So we have to check map->objcg for being NULL each time it's * being used. */ map->objcg = get_obj_cgroup_from_current(); } So for the root_mem_cgroup case, bpf_map_get_memcg() will return root_mem_cgroup directly without getting its css, right ? See below, static struct mem_cgroup *bpf_map_get_memcg(const struct bpf_map *map) { if (map->objcg) return get_mem_cgroup_from_objcg(map->objcg); return root_mem_cgroup; // without css_get(&memcg->css); } But it will put the css unconditionally. See below, memcg = bpf_map_get_memcg(map); ... mem_cgroup_put(memcg); So we should put it *conditionally* as well. memcg = bpf_map_get_memcg(map); ... + if (map->objcg) mem_cgroup_put(memcg); Is it clear to you ? > Or are you saying that root_mem_cgroup is NULL? > No -- Regards Yafang