> On Aug 12, 2022, at 08:27, Yafang Shao <laoar.shao@xxxxxxxxx> wrote: > > 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. Hi, No. We could put root_mem_cgroup unconditionally since the root css is treated as no reference css. See css_put(). static inline void css_put(struct cgroup_subsys_state *css) { // The root memcg’s css has been set with CSS_NO_REF. if (!(css->flags & CSS_NO_REF)) percpu_ref_put(&css->refcnt); } Muchun, Thanks. > > 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