From: Alexandre Ghiti <alex@ghiti.fr>
To: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Yosry Ahmed <yosry@kernel.org>, Nhat Pham <nphamcs@gmail.com>,
Chengming Zhou <chengming.zhou@linux.dev>,
Christoph Hellwig <hch@lst.de>, Chris Li <chrisl@kernel.org>,
Kairui Song <kasong@tencent.com>
Subject: [PATCH 2/2] mm/zswap: plug the writeback IO of an LRU walk
Date: Wed, 7 Oct 2026 17:34:44 +0200 [thread overview]
Message-ID: <20261007153507.50715-3-alex@ghiti.fr> (raw)
In-Reply-To: <20261007153507.50715-1-alex@ghiti.fr>
zswap writeback only appends an entry to the pending bio when its slot
directly follows the previous one, and submits the pending bio
otherwise.
Plug the LRU walk so that the block layer can merge what the batch
cannot.
Kernel build (defconfig, -j4) in a 600M memory.max cgroup with the zswap
shrinker enabled, swapping to an NVMe partition with iocost enabled. It
runs alone, and next to a sibling fio random writer with 10 times its
io.weight so that iocost throttles it. Mean +- stddev, counters from the
build's cgroup:
Alone:
unplugged plugged
build time (s) 1061 +- 2 1057 +- 2 -0.4%
write requests (k) 622 +- 34 579 +- 21 -6.8%
pages per write request 1.30 +- 0.02 1.36 +- 0.05 +4.9%
iocost debt (s) 14.0 +- 2.5 11.0 +- 1.7 -21.6%
iocost wait (s) 7.7 +- 1.8 7.1 +- 1.1 -7.9%
IO full pressure (s) 18.3 +- 1.4 17.5 +- 1.3 -4.5%
Next to the writer:
unplugged plugged
build time (s) 2188 +- 45 2104 +- 75 -3.8%
write requests (k) 594 +- 21 567 +- 24 -4.6%
pages per write request 1.30 +- 0.01 1.35 +- 0.02 +3.6%
iocost debt (s) 648 +- 22 645 +- 29 -0.5%
iocost wait (s) 624 +- 23 633 +- 29 +1.5%
IO full pressure (s) 615 +- 31 550 +- 44 -10.6%
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
mm/zswap.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/mm/zswap.c b/mm/zswap.c
index 698fb74c5d47..39c4d891cc86 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -20,6 +20,7 @@
#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/atomic.h>
+#include <linux/blkdev.h>
#include <linux/swap_ops.h>
#include <linux/crypto.h>
#include <linux/scatterlist.h>
@@ -1225,6 +1226,7 @@ static unsigned long zswap_shrinker_scan(struct shrinker *shrinker,
.encountered_page_in_swapcache = &encountered_page_in_swapcache,
};
unsigned long shrink_ret;
+ struct blk_plug plug;
if (!zswap_shrinker_enabled ||
!mem_cgroup_zswap_writeback_enabled(sc->memcg)) {
@@ -1232,10 +1234,12 @@ static unsigned long zswap_shrinker_scan(struct shrinker *shrinker,
return SHRINK_STOP;
}
+ blk_start_plug(&plug);
shrink_ret = list_lru_shrink_walk(&zswap_list_lru, sc, &shrink_memcg_cb,
&ctl);
swap_write_submit(&ctl.io_ctx);
+ blk_finish_plug(&plug);
if (encountered_page_in_swapcache)
return SHRINK_STOP;
@@ -1343,6 +1347,7 @@ static int shrink_memcg(struct mem_cgroup *memcg)
{
struct zswap_shrink_ctl ctl = {};
int nid, shrunk = 0, scanned = 0;
+ struct blk_plug plug;
if (!mem_cgroup_zswap_writeback_enabled(memcg))
return -ENOENT;
@@ -1354,6 +1359,7 @@ static int shrink_memcg(struct mem_cgroup *memcg)
if (memcg && !mem_cgroup_online(memcg))
return -ENOENT;
+ blk_start_plug(&plug);
for_each_node_state(nid, N_NORMAL_MEMORY) {
unsigned long nr_to_walk = SWAP_CLUSTER_MAX;
@@ -1363,6 +1369,7 @@ static int shrink_memcg(struct mem_cgroup *memcg)
}
swap_write_submit(&ctl.io_ctx);
+ blk_finish_plug(&plug);
/* Nothing was scanned: every LRU under @memcg was empty. */
if (!scanned)
--
2.53.0-Meta
next prev parent reply other threads:[~2026-10-07 15:59 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-07 15:34 [PATCH 0/2] mm/zswap: batch the writeback IO Alexandre Ghiti
2026-10-07 15:34 ` [PATCH 1/2] mm/zswap: batch the writeback IO of consecutive entries Alexandre Ghiti
2026-10-09 6:34 ` Nhat Pham
2026-10-07 15:34 ` Alexandre Ghiti [this message]
2026-10-09 6:36 ` [PATCH 2/2] mm/zswap: plug the writeback IO of an LRU walk Nhat Pham
2026-10-08 10:04 ` [PATCH 0/2] mm/zswap: batch the writeback IO Christoph Hellwig
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=20261007153507.50715-3-alex@ghiti.fr \
--to=alex@ghiti.fr \
--cc=akpm@linux-foundation.org \
--cc=chengming.zhou@linux.dev \
--cc=chrisl@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=hch@lst.de \
--cc=kasong@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=yosry@kernel.org \
/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
all inboxes | Powered by JetHome®