On Mon, Feb 15, 2021 at 6:27 PM Michal Hocko <mhocko@xxxxxxxx> wrote: > > On Mon 15-02-21 18:09:44, Muchun Song wrote: > > 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? > > If the above claim is correct, which I would need to double check then > it should have been part of the changelog! Please think of your poor > reviewers and the time they have to invest into the review. The easy way may be adding a printk to mem_cgroup_from_id when the parameter is zero. > > I would also like to see your waste of CPU cycles argument to be backed > by something. Are we talking about cycles due to an additional function Yeah, when the parameter is already zero, idr_find() must return zero. So I think that the additional function call is unnecessary. I have added a printk to mem_cgroup_from_id, I found the parameter can be zero several times. > call? Is this really something we should even care about? Maybe not. Just my thoughts. Thanks. > > > > > > > > > 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 > > -- > Michal Hocko > SUSE Labs