All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yang Shi <shy828301@gmail.com>
To: Roman Gushchin <guro@fb.com>
Cc: Kirill Tkhai <ktkhai@virtuozzo.com>,
	Vlastimil Babka <vbabka@suse.cz>,
	Shakeel Butt <shakeelb@google.com>,
	Dave Chinner <david@fromorbit.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Michal Hocko <mhocko@suse.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linux MM <linux-mm@kvack.org>,
	Linux FS-devel Mailing List <linux-fsdevel@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [v7 PATCH 03/12] mm: vmscan: use shrinker_rwsem to protect shrinker_maps allocation
Date: Tue, 9 Feb 2021 15:28:30 -0800	[thread overview]
Message-ID: <CAHbLzkqgd0U7pH2czz23HvRcbwOeSRzaHyCTZptfdX5mkgXqTA@mail.gmail.com> (raw)
In-Reply-To: <20210209203307.GF524633@carbon.DHCP.thefacebook.com>

On Tue, Feb 9, 2021 at 12:33 PM Roman Gushchin <guro@fb.com> wrote:
>
> On Tue, Feb 09, 2021 at 09:46:37AM -0800, Yang Shi wrote:
> > Since memcg_shrinker_map_size just can be changed under holding shrinker_rwsem
> > exclusively, the read side can be protected by holding read lock, so it sounds
> > superfluous to have a dedicated mutex.
> >
> > Kirill Tkhai suggested use write lock since:
> >
> >   * We want the assignment to shrinker_maps is visible for shrink_slab_memcg().
> >   * The rcu_dereference_protected() dereferrencing in shrink_slab_memcg(), but
> >     in case of we use READ lock in alloc_shrinker_maps(), the dereferrencing
> >     is not actually protected.
> >   * READ lock makes alloc_shrinker_info() racy against memory allocation fail.
> >     alloc_shrinker_info()->free_shrinker_info() may free memory right after
> >     shrink_slab_memcg() dereferenced it. You may say
> >     shrink_slab_memcg()->mem_cgroup_online() protects us from it? Yes, sure,
> >     but this is not the thing we want to remember in the future, since this
> >     spreads modularity.
> >
> > And a test with heavy paging workload didn't show write lock makes things worse.
> >
> > Acked-by: Vlastimil Babka <vbabka@suse.cz>
> > Acked-by: Kirill Tkhai <ktkhai@virtuozzo.com>
> > Signed-off-by: Yang Shi <shy828301@gmail.com>
>
> Acked-by: Roman Gushchin <guro@fb.com>
>
> with a small nit (below):
>
> > ---
> >  mm/vmscan.c | 16 ++++++----------
> >  1 file changed, 6 insertions(+), 10 deletions(-)
> >
> > diff --git a/mm/vmscan.c b/mm/vmscan.c
> > index 96b08c79f18d..e4ddaaaeffe2 100644
> > --- a/mm/vmscan.c
> > +++ b/mm/vmscan.c
> > @@ -187,7 +187,6 @@ static DECLARE_RWSEM(shrinker_rwsem);
> >  #ifdef CONFIG_MEMCG
> >
> >  static int memcg_shrinker_map_size;
> > -static DEFINE_MUTEX(memcg_shrinker_map_mutex);
> >
> >  static void free_shrinker_map_rcu(struct rcu_head *head)
> >  {
> > @@ -200,8 +199,6 @@ static int expand_one_shrinker_map(struct mem_cgroup *memcg,
> >       struct memcg_shrinker_map *new, *old;
> >       int nid;
> >
> > -     lockdep_assert_held(&memcg_shrinker_map_mutex);
> > -
>
> Why not check that shrinker_rwsem is down here?

No special reason, just because we know it was acquired before. We
could add the check, but not here. I think it'd be better to have the
assert in expand_shrinker_maps() since the rwsem was acquired before
calling it.

>
> >       for_each_node(nid) {
> >               old = rcu_dereference_protected(
> >                       mem_cgroup_nodeinfo(memcg, nid)->shrinker_map, true);
> > @@ -249,7 +246,7 @@ int alloc_shrinker_maps(struct mem_cgroup *memcg)
> >       if (mem_cgroup_is_root(memcg))
> >               return 0;
> >
> > -     mutex_lock(&memcg_shrinker_map_mutex);
> > +     down_write(&shrinker_rwsem);
> >       size = memcg_shrinker_map_size;
> >       for_each_node(nid) {
> >               map = kvzalloc_node(sizeof(*map) + size, GFP_KERNEL, nid);
> > @@ -260,7 +257,7 @@ int alloc_shrinker_maps(struct mem_cgroup *memcg)
> >               }
> >               rcu_assign_pointer(memcg->nodeinfo[nid]->shrinker_map, map);
> >       }
> > -     mutex_unlock(&memcg_shrinker_map_mutex);
> > +     up_write(&shrinker_rwsem);
> >
> >       return ret;
> >  }
> > @@ -275,9 +272,8 @@ static int expand_shrinker_maps(int new_id)
> >       if (size <= old_size)
> >               return 0;
> >
> > -     mutex_lock(&memcg_shrinker_map_mutex);
>
> And here as well. It will make the locking model more obvious and will help
> to avoid errors in the future.
>
> >       if (!root_mem_cgroup)
> > -             goto unlock;
> > +             goto out;
> >
> >       memcg = mem_cgroup_iter(NULL, NULL, NULL);
> >       do {
> > @@ -286,13 +282,13 @@ static int int new_id)
> >               ret = expand_one_shrinker_map(memcg, size, old_size);
> >               if (ret) {
> >                       mem_cgroup_iter_break(NULL, memcg);
> > -                     goto unlock;
> > +                     goto out;
> >               }
> >       } while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)) != NULL);
> > -unlock:
> > +out:
> >       if (!ret)
> >               memcg_shrinker_map_size = size;
> > -     mutex_unlock(&memcg_shrinker_map_mutex);
> > +
> >       return ret;
> >  }
> >
> > --
> > 2.26.2
> >

  reply	other threads:[~2021-02-10  1:39 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-09 17:46 [v7 PATCH 0/12] Make shrinker's nr_deferred memcg aware Yang Shi
2021-02-09 17:46 ` [v7 PATCH 01/12] mm: vmscan: use nid from shrink_control for tracepoint Yang Shi
2021-02-09 19:14   ` Shakeel Butt
2021-02-09 19:14     ` Shakeel Butt
2021-02-10 16:58     ` Yang Shi
2021-02-10 16:58       ` Yang Shi
2021-02-09 19:21   ` Roman Gushchin
2021-02-09 17:46 ` [v7 PATCH 02/12] mm: vmscan: consolidate shrinker_maps handling code Yang Shi
2021-02-09 20:27   ` Roman Gushchin
2021-02-10 14:19   ` Shakeel Butt
2021-02-10 14:19     ` Shakeel Butt
2021-02-09 17:46 ` [v7 PATCH 03/12] mm: vmscan: use shrinker_rwsem to protect shrinker_maps allocation Yang Shi
2021-02-09 20:33   ` Roman Gushchin
2021-02-09 23:28     ` Yang Shi [this message]
2021-02-09 23:28       ` Yang Shi
2021-02-09 17:46 ` [v7 PATCH 04/12] mm: vmscan: remove memcg_shrinker_map_size Yang Shi
2021-02-09 20:43   ` Roman Gushchin
2021-02-09 23:31     ` Yang Shi
2021-02-09 23:31       ` Yang Shi
2021-02-10 18:14     ` Vlastimil Babka
2021-02-09 17:46 ` [v7 PATCH 05/12] mm: memcontrol: rename shrinker_map to shrinker_info Yang Shi
2021-02-09 20:50   ` Roman Gushchin
2021-02-09 23:33     ` Yang Shi
2021-02-09 23:33       ` Yang Shi
2021-02-10  0:16       ` Roman Gushchin
2021-02-11 16:47       ` Kirill Tkhai
2021-02-11 17:29         ` Yang Shi
2021-02-11 17:29           ` Yang Shi
2021-02-09 17:46 ` [v7 PATCH 06/12] mm: vmscan: add shrinker_info_protected() helper Yang Shi
2021-02-10  0:22   ` Roman Gushchin
2021-02-10  1:07     ` Yang Shi
2021-02-10  1:07       ` Yang Shi
2021-02-10  1:29       ` Roman Gushchin
2021-02-10 12:12   ` Kirill Tkhai
2021-02-10 18:17   ` Vlastimil Babka
2021-02-12  6:54   ` [mm] bd741fb2ad: WARNING:suspicious_RCU_usage kernel test robot
2021-02-12  6:54     ` kernel test robot
2021-02-09 17:46 ` [v7 PATCH 07/12] mm: vmscan: use a new flag to indicate shrinker is registered Yang Shi
2021-02-10  0:39   ` Roman Gushchin
2021-02-10  1:12     ` Yang Shi
2021-02-10  1:12       ` Yang Shi
2021-02-10  1:34       ` Roman Gushchin
2021-02-10  1:55         ` Yang Shi
2021-02-10  1:55           ` Yang Shi
2021-02-10 18:45     ` Yang Shi
2021-02-10 18:45       ` Yang Shi
2021-02-10 18:23   ` Vlastimil Babka
2021-02-09 17:46 ` [v7 PATCH 08/12] mm: vmscan: add per memcg shrinker nr_deferred Yang Shi
2021-02-10  1:10   ` Roman Gushchin
2021-02-10  1:25     ` Yang Shi
2021-02-10  1:25       ` Yang Shi
2021-02-10  1:40       ` Roman Gushchin
2021-02-10  1:57         ` Yang Shi
2021-02-10  1:57           ` Yang Shi
2021-02-09 17:46 ` [v7 PATCH 09/12] mm: vmscan: use per memcg nr_deferred of shrinker Yang Shi
2021-02-10  1:27   ` Roman Gushchin
2021-02-10  1:52     ` Yang Shi
2021-02-10  1:52       ` Yang Shi
2021-02-10 14:36       ` Kirill Tkhai
2021-02-10 16:41         ` Yang Shi
2021-02-10 16:41           ` Yang Shi
2021-02-09 17:46 ` [v7 PATCH 10/12] mm: vmscan: don't need allocate shrinker->nr_deferred for memcg aware shrinkers Yang Shi
2021-02-10  1:23   ` Roman Gushchin
2021-02-09 17:46 ` [v7 PATCH 11/12] mm: memcontrol: reparent nr_deferred when memcg offline Yang Shi
2021-02-10  1:18   ` Roman Gushchin
2021-02-09 17:46 ` [v7 PATCH 12/12] mm: vmscan: shrink deferred objects proportional to priority Yang Shi
2021-02-11 13:10   ` Vlastimil Babka
2021-02-11 17:29     ` Yang Shi
2021-02-11 17:29       ` Yang Shi
2021-02-11 18:52       ` Vlastimil Babka
2021-02-11 19:15         ` Yang Shi
2021-02-11 19:15           ` Yang Shi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAHbLzkqgd0U7pH2czz23HvRcbwOeSRzaHyCTZptfdX5mkgXqTA@mail.gmail.com \
    --to=shy828301@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=david@fromorbit.com \
    --cc=guro@fb.com \
    --cc=hannes@cmpxchg.org \
    --cc=ktkhai@virtuozzo.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=shakeelb@google.com \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.