lkml.org 
[lkml]   [2021]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/7] mm: memcontrol: bail out early when !mm in get_mem_cgroup_from_mm
    On Tue 13-04-21 14:51:48, Muchun Song wrote:
    > When mm is NULL, we do not need to hold rcu lock and call css_tryget for
    > the root memcg. And we also do not need to check !mm in every loop of
    > while. So bail out early when !mm.

    mem_cgroup_charge and other callers unconditionally drop the reference
    so how come this does not underflow reference count?

    > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
    > Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    > Reviewed-by: Shakeel Butt <shakeelb@google.com>
    > ---
    > mm/memcontrol.c | 21 ++++++++++-----------
    > 1 file changed, 10 insertions(+), 11 deletions(-)
    >
    > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
    > index f229de925aa5..9cbfff59b171 100644
    > --- a/mm/memcontrol.c
    > +++ b/mm/memcontrol.c
    > @@ -901,20 +901,19 @@ struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm)
    > if (mem_cgroup_disabled())
    > return NULL;
    >
    > + /*
    > + * Page cache insertions can happen without an
    > + * actual mm context, e.g. during disk probing
    > + * on boot, loopback IO, acct() writes etc.
    > + */
    > + if (unlikely(!mm))
    > + return root_mem_cgroup;
    > +
    > rcu_read_lock();
    > do {
    > - /*
    > - * Page cache insertions can happen without an
    > - * actual mm context, e.g. during disk probing
    > - * on boot, loopback IO, acct() writes etc.
    > - */
    > - if (unlikely(!mm))
    > + memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
    > + if (unlikely(!memcg))
    > memcg = root_mem_cgroup;
    > - else {
    > - memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
    > - if (unlikely(!memcg))
    > - memcg = root_mem_cgroup;
    > - }
    > } while (!css_tryget(&memcg->css));
    > rcu_read_unlock();
    > return memcg;
    > --
    > 2.11.0

    --
    Michal Hocko
    SUSE Labs

    \
     
     \ /
      Last update: 2021-04-14 11:25    [W:2.985 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site