On Fri, Aug 12, 2022 at 1:34 PM Muchun Song <muchun.song@xxxxxxxxx> wrote: > > > > > 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); > } Indeed. I missed that. The call stack is so deep that I didn't look into it :( Thanks for the information. -- Regards Yafang