From: Johannes Weiner <hannes@cmpxchg.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Nhat Pham <nphamcs@gmail.com>,
Yosry Ahmed <yosryahmed@google.com>,
Chengming Zhou <zhouchengming@bytedance.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: [PATCH 20/20] mm: zswap: function ordering: shrink_memcg_cb
Date: Mon, 29 Jan 2024 20:36:56 -0500 [thread overview]
Message-ID: <20240130014208.565554-21-hannes@cmpxchg.org> (raw)
In-Reply-To: <20240130014208.565554-1-hannes@cmpxchg.org>
shrink_memcg_cb() is called by the shrinker and is based on
zswap_writeback_entry(). Move it in between. Save one fwd decl.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
---
mm/zswap.c | 125 ++++++++++++++++++++++++++---------------------------
1 file changed, 61 insertions(+), 64 deletions(-)
diff --git a/mm/zswap.c b/mm/zswap.c
index 0cb3437d47eb..4aea03285532 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -1254,7 +1254,67 @@ static int zswap_writeback_entry(struct zswap_entry *entry,
* shrinker functions
**********************************/
static enum lru_status shrink_memcg_cb(struct list_head *item, struct list_lru_one *l,
- spinlock_t *lock, void *arg);
+ spinlock_t *lock, void *arg)
+{
+ struct zswap_entry *entry = container_of(item, struct zswap_entry, lru);
+ bool *encountered_page_in_swapcache = (bool *)arg;
+ swp_entry_t swpentry;
+ enum lru_status ret = LRU_REMOVED_RETRY;
+ int writeback_result;
+
+ /*
+ * Rotate the entry to the tail before unlocking the LRU,
+ * so that in case of an invalidation race concurrent
+ * reclaimers don't waste their time on it.
+ *
+ * If writeback succeeds, or failure is due to the entry
+ * being invalidated by the swap subsystem, the invalidation
+ * will unlink and free it.
+ *
+ * Temporary failures, where the same entry should be tried
+ * again immediately, almost never happen for this shrinker.
+ * We don't do any trylocking; -ENOMEM comes closest,
+ * but that's extremely rare and doesn't happen spuriously
+ * either. Don't bother distinguishing this case.
+ *
+ * But since they do exist in theory, the entry cannot just
+ * be unlinked, or we could leak it. Hence, rotate.
+ */
+ list_move_tail(item, &l->list);
+
+ /*
+ * Once the lru lock is dropped, the entry might get freed. The
+ * swpentry is copied to the stack, and entry isn't deref'd again
+ * until the entry is verified to still be alive in the tree.
+ */
+ swpentry = entry->swpentry;
+
+ /*
+ * It's safe to drop the lock here because we return either
+ * LRU_REMOVED_RETRY or LRU_RETRY.
+ */
+ spin_unlock(lock);
+
+ writeback_result = zswap_writeback_entry(entry, swpentry);
+
+ if (writeback_result) {
+ zswap_reject_reclaim_fail++;
+ ret = LRU_RETRY;
+
+ /*
+ * Encountering a page already in swap cache is a sign that we are shrinking
+ * into the warmer region. We should terminate shrinking (if we're in the dynamic
+ * shrinker context).
+ */
+ if (writeback_result == -EEXIST && encountered_page_in_swapcache)
+ *encountered_page_in_swapcache = true;
+ } else {
+ zswap_written_back_pages++;
+ }
+
+ spin_lock(lock);
+ return ret;
+}
static unsigned long zswap_shrinker_scan(struct shrinker *shrinker,
struct shrink_control *sc)
@@ -1354,69 +1414,6 @@ static void zswap_alloc_shrinker(struct zswap_pool *pool)
pool->shrinker->seeks = DEFAULT_SEEKS;
}
-static enum lru_status shrink_memcg_cb(struct list_head *item, struct list_lru_one *l,
- spinlock_t *lock, void *arg)
-{
- struct zswap_entry *entry = container_of(item, struct zswap_entry, lru);
- bool *encountered_page_in_swapcache = (bool *)arg;
- swp_entry_t swpentry;
- enum lru_status ret = LRU_REMOVED_RETRY;
- int writeback_result;
-
- /*
- * Rotate the entry to the tail before unlocking the LRU,
- * so that in case of an invalidation race concurrent
- * reclaimers don't waste their time on it.
- *
- * If writeback succeeds, or failure is due to the entry
- * being invalidated by the swap subsystem, the invalidation
- * will unlink and free it.
- *
- * Temporary failures, where the same entry should be tried
- * again immediately, almost never happen for this shrinker.
- * We don't do any trylocking; -ENOMEM comes closest,
- * but that's extremely rare and doesn't happen spuriously
- * either. Don't bother distinguishing this case.
- *
- * But since they do exist in theory, the entry cannot just
- * be unlinked, or we could leak it. Hence, rotate.
- */
- list_move_tail(item, &l->list);
-
- /*
- * Once the lru lock is dropped, the entry might get freed. The
- * swpentry is copied to the stack, and entry isn't deref'd again
- * until the entry is verified to still be alive in the tree.
- */
- swpentry = entry->swpentry;
-
- /*
- * It's safe to drop the lock here because we return either
- * LRU_REMOVED_RETRY or LRU_RETRY.
- */
- spin_unlock(lock);
-
- writeback_result = zswap_writeback_entry(entry, swpentry);
-
- if (writeback_result) {
- zswap_reject_reclaim_fail++;
- ret = LRU_RETRY;
-
- /*
- * Encountering a page already in swap cache is a sign that we are shrinking
- * into the warmer region. We should terminate shrinking (if we're in the dynamic
- * shrinker context).
- */
- if (writeback_result == -EEXIST && encountered_page_in_swapcache)
- *encountered_page_in_swapcache = true;
- } else {
- zswap_written_back_pages++;
- }
-
- spin_lock(lock);
- return ret;
-}
-
static int shrink_memcg(struct mem_cgroup *memcg)
{
struct zswap_pool *pool;
--
2.43.0
next prev parent reply other threads:[~2024-01-30 1:43 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-30 1:36 [PATCH 00/20] mm: zswap: cleanups Johannes Weiner
2024-01-30 1:36 ` [PATCH 01/20] mm: zswap: rename zswap_free_entry to zswap_entry_free Johannes Weiner
2024-01-30 3:13 ` Chengming Zhou
[not found] ` <20240130031938.GA772725@cmpxchg.org>
2024-01-30 3:21 ` Chengming Zhou
2024-01-30 3:36 ` Chengming Zhou
2024-01-30 8:08 ` Yosry Ahmed
2024-01-30 9:11 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 02/20] mm: zswap: inline and remove zswap_entry_find_get() Johannes Weiner
2024-01-30 3:37 ` Chengming Zhou
2024-01-30 8:09 ` Yosry Ahmed
2024-01-30 16:24 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 03/20] mm: zswap: move zswap_invalidate_entry() to related functions Johannes Weiner
2024-01-30 3:38 ` Chengming Zhou
2024-01-30 8:09 ` Yosry Ahmed
2024-01-30 16:25 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 04/20] mm: zswap: warn when referencing a dead entry Johannes Weiner
2024-01-30 3:39 ` [External] " Chengming Zhou
2024-01-30 8:10 ` Yosry Ahmed
2024-01-30 16:27 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 05/20] mm: zswap: clean up zswap_entry_put() Johannes Weiner
2024-01-30 3:39 ` Chengming Zhou
2024-01-30 7:51 ` Yosry Ahmed
2024-01-30 16:31 ` Nhat Pham
2024-01-30 17:02 ` Yosry Ahmed
2024-01-30 8:10 ` Yosry Ahmed
2024-01-30 1:36 ` [PATCH 06/20] mm: zswap: rename __zswap_load() to zswap_decompress() Johannes Weiner
2024-01-30 3:19 ` Chengming Zhou
2024-01-30 8:11 ` Yosry Ahmed
2024-01-30 16:33 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 07/20] mm: zswap: break out zwap_compress() Johannes Weiner
2024-01-30 3:23 ` Chengming Zhou
2024-01-30 8:11 ` Yosry Ahmed
2024-01-30 16:21 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 08/20] mm: zswap: further cleanup zswap_store() Johannes Weiner
2024-01-30 3:35 ` Chengming Zhou
2024-01-30 8:12 ` Yosry Ahmed
2024-01-30 18:18 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 09/20] mm: zswap: simplify zswap_invalidate() Johannes Weiner
2024-01-30 3:35 ` Chengming Zhou
2024-01-30 8:12 ` Yosry Ahmed
2024-01-30 16:50 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 10/20] mm: zswap: function ordering: pool alloc & free Johannes Weiner
2024-01-30 19:31 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 11/20] mm: zswap: function ordering: pool refcounting Johannes Weiner
2024-01-30 20:13 ` Nhat Pham
2024-01-31 11:23 ` Johannes Weiner
2024-01-31 23:23 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 12/20] mm: zswap: function ordering: zswap_pools Johannes Weiner
2024-01-30 21:16 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 13/20] mm: zswap: function ordering: pool params Johannes Weiner
2024-01-30 21:22 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 14/20] mm: zswap: function ordering: public lru api Johannes Weiner
2024-01-30 23:47 ` Nhat Pham
2024-01-31 11:40 ` Johannes Weiner
2024-01-30 1:36 ` [PATCH 15/20] mm: zswap: function ordering: move entry sections out of LRU section Johannes Weiner
2024-01-30 23:48 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 16/20] mm: zswap: function ordering: move entry section out of tree section Johannes Weiner
2024-01-31 23:24 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 17/20] mm: zswap: function ordering: compress & decompress functions Johannes Weiner
2024-01-31 23:25 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 18/20] mm: zswap: function ordering: per-cpu compression infra Johannes Weiner
2024-01-31 23:33 ` Nhat Pham
2024-01-30 1:36 ` [PATCH 19/20] mm: zswap: function ordering: writeback Johannes Weiner
2024-01-31 23:36 ` Nhat Pham
2024-01-30 1:36 ` Johannes Weiner [this message]
2024-01-31 23:37 ` [PATCH 20/20] mm: zswap: function ordering: shrink_memcg_cb Nhat Pham
2024-01-30 8:16 ` [PATCH 00/20] mm: zswap: cleanups Yosry Ahmed
2024-01-30 12:21 ` Sergey Senozhatsky
2024-01-30 15:52 ` Johannes Weiner
2024-01-31 1:03 ` Sergey Senozhatsky
2024-01-30 15:46 ` Johannes Weiner
2024-01-30 17:15 ` Yosry Ahmed
2024-01-30 23:54 ` Nhat Pham
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=20240130014208.565554-21-hannes@cmpxchg.org \
--to=hannes@cmpxchg.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=yosryahmed@google.com \
--cc=zhouchengming@bytedance.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox