All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yang Shi <shy828301@gmail.com>
To: guro@fb.com, ktkhai@virtuozzo.com, vbabka@suse.cz,
	shakeelb@google.com, david@fromorbit.com, hannes@cmpxchg.org,
	mhocko@suse.com, akpm@linux-foundation.org
Cc: shy828301@gmail.com, linux-mm@kvack.org,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [v7 PATCH 07/12] mm: vmscan: use a new flag to indicate shrinker is registered
Date: Tue,  9 Feb 2021 09:46:41 -0800	[thread overview]
Message-ID: <20210209174646.1310591-8-shy828301@gmail.com> (raw)
In-Reply-To: <20210209174646.1310591-1-shy828301@gmail.com>

Currently registered shrinker is indicated by non-NULL shrinker->nr_deferred.
This approach is fine with nr_deferred at the shrinker level, but the following
patches will move MEMCG_AWARE shrinkers' nr_deferred to memcg level, so their
shrinker->nr_deferred would always be NULL.  This would prevent the shrinkers
from unregistering correctly.

Remove SHRINKER_REGISTERING since we could check if shrinker is registered
successfully by the new flag.

Acked-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: Yang Shi <shy828301@gmail.com>
---
 include/linux/shrinker.h |  7 ++++---
 mm/vmscan.c              | 31 +++++++++----------------------
 2 files changed, 13 insertions(+), 25 deletions(-)

diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
index 0f80123650e2..1eac79ce57d4 100644
--- a/include/linux/shrinker.h
+++ b/include/linux/shrinker.h
@@ -79,13 +79,14 @@ struct shrinker {
 #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
 
 /* Flags */
-#define SHRINKER_NUMA_AWARE	(1 << 0)
-#define SHRINKER_MEMCG_AWARE	(1 << 1)
+#define SHRINKER_REGISTERED	(1 << 0)
+#define SHRINKER_NUMA_AWARE	(1 << 1)
+#define SHRINKER_MEMCG_AWARE	(1 << 2)
 /*
  * It just makes sense when the shrinker is also MEMCG_AWARE for now,
  * non-MEMCG_AWARE shrinker should not have this flag set.
  */
-#define SHRINKER_NONSLAB	(1 << 2)
+#define SHRINKER_NONSLAB	(1 << 3)
 
 extern int prealloc_shrinker(struct shrinker *shrinker);
 extern void register_shrinker_prepared(struct shrinker *shrinker);
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 273efbf4d53c..a047980536cf 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -315,19 +315,6 @@ void set_shrinker_bit(struct mem_cgroup *memcg, int nid, int shrinker_id)
 	}
 }
 
-/*
- * We allow subsystems to populate their shrinker-related
- * LRU lists before register_shrinker_prepared() is called
- * for the shrinker, since we don't want to impose
- * restrictions on their internal registration order.
- * In this case shrink_slab_memcg() may find corresponding
- * bit is set in the shrinkers map.
- *
- * This value is used by the function to detect registering
- * shrinkers and to skip do_shrink_slab() calls for them.
- */
-#define SHRINKER_REGISTERING ((struct shrinker *)~0UL)
-
 static DEFINE_IDR(shrinker_idr);
 
 static int prealloc_memcg_shrinker(struct shrinker *shrinker)
@@ -336,7 +323,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker)
 
 	down_write(&shrinker_rwsem);
 	/* This may call shrinker, so it must use down_read_trylock() */
-	id = idr_alloc(&shrinker_idr, SHRINKER_REGISTERING, 0, 0, GFP_KERNEL);
+	id = idr_alloc(&shrinker_idr, shrinker, 0, 0, GFP_KERNEL);
 	if (id < 0)
 		goto unlock;
 
@@ -499,10 +486,7 @@ void register_shrinker_prepared(struct shrinker *shrinker)
 {
 	down_write(&shrinker_rwsem);
 	list_add_tail(&shrinker->list, &shrinker_list);
-#ifdef CONFIG_MEMCG
-	if (shrinker->flags & SHRINKER_MEMCG_AWARE)
-		idr_replace(&shrinker_idr, shrinker, shrinker->id);
-#endif
+	shrinker->flags |= SHRINKER_REGISTERED;
 	up_write(&shrinker_rwsem);
 }
 
@@ -522,13 +506,16 @@ EXPORT_SYMBOL(register_shrinker);
  */
 void unregister_shrinker(struct shrinker *shrinker)
 {
-	if (!shrinker->nr_deferred)
+	if (!(shrinker->flags & SHRINKER_REGISTERED))
 		return;
-	if (shrinker->flags & SHRINKER_MEMCG_AWARE)
-		unregister_memcg_shrinker(shrinker);
+
 	down_write(&shrinker_rwsem);
 	list_del(&shrinker->list);
+	shrinker->flags &= ~SHRINKER_REGISTERED;
 	up_write(&shrinker_rwsem);
+
+	if (shrinker->flags & SHRINKER_MEMCG_AWARE)
+		unregister_memcg_shrinker(shrinker);
 	kfree(shrinker->nr_deferred);
 	shrinker->nr_deferred = NULL;
 }
@@ -693,7 +680,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid,
 		struct shrinker *shrinker;
 
 		shrinker = idr_find(&shrinker_idr, i);
-		if (unlikely(!shrinker || shrinker == SHRINKER_REGISTERING)) {
+		if (unlikely(!shrinker || !(shrinker->flags & SHRINKER_REGISTERED))) {
 			if (!shrinker)
 				clear_bit(i, info->map);
 			continue;
-- 
2.26.2


  parent reply	other threads:[~2021-02-09 18:41 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
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 ` Yang Shi [this message]
2021-02-10  0:39   ` [v7 PATCH 07/12] mm: vmscan: use a new flag to indicate shrinker is registered 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=20210209174646.1310591-8-shy828301@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.