On Mon, Feb 15, 2021 at 5:39 PM Michal Hocko <mhocko@xxxxxxxx> wrote: > > On Sat 13-02-21 01:01:58, Muchun Song wrote: > > The memcg ID cannot be zero, but we can pass zero to mem_cgroup_from_id, > > so idr_find() is pointless and wastes CPU cycles. > > Is this possible at all to happen? If not why should we add a test for > _all_ invocations? Yeah, this indeed can happen. If we allocate a new swap cache page and charge it via mem_cgroup_charge, then the page will uncharge the swap counter via mem_cgroup_uncharge_swap. When the swap entry is indeed freed, we will call mem_cgroup_uncharge_swap again, In this routine, we can pass zero to mem_cgroup_from_id. Right? > > > > > Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx> > > --- > > mm/memcontrol.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index a3f26522765a..68ed4b297c13 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -5173,6 +5173,9 @@ static inline void mem_cgroup_id_put(struct mem_cgroup *memcg) > > struct mem_cgroup *mem_cgroup_from_id(unsigned short id) > > { > > WARN_ON_ONCE(!rcu_read_lock_held()); > > + /* The memcg ID cannot be zero. */ > > + if (id == 0) > > + return NULL; > > return idr_find(&mem_cgroup_idr, id); > > } > > > > -- > > 2.11.0 > > -- > Michal Hocko > SUSE Labs