summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2026-07-23 07:46:04 +0200
committerAndrew Morton <akpm@linux-foundation.org>2026-08-20 18:24:43 -0700
commit7fdb8e03d6a19aaec4eef03bfdff4613821bb9a8 (patch)
tree643b72e83313e0fa411596fc4fa1a55171ecd307 /mm
parent5119628e391d40f8e1953630672d11d7d5f6dfe3 (diff)
downloadlinux-next-7fdb8e03d6a19aaec4eef03bfdff4613821bb9a8.tar.gz
linux-next-7fdb8e03d6a19aaec4eef03bfdff4613821bb9a8.zip
mm/swap: revert to single-folio writes for synchronous swap devices
Patch series "swap_ops updates", v2. This series is a follow on to the swap ops series now in mm-unstable. The first patch reintroduces direct folio writes for synchronous swap files, the other two remove the double indirect for file system based swap. This patch (of 3): Kairui Song reported that zram benefits from submitting each folio directly instead of batching up I/O because the classic LRU scanning benefits from clearing the folio writeback bit in the scan loop. Accommodate that by kicking off writes for synchronous devices for each iteration. Link: https://lore.kernel.org/20260723054622.3460249-1-hch@lst.de Link: https://lore.kernel.org/20260723054622.3460249-2-hch@lst.de Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Usama Arif <usama.arif@linux.dev> Acked-by: Chris Li <chrisl@kernel.org> Cc: Baoquan He <baoquan.he@linux.dev> Cc: Kairui Song <kasong@tencent.com> Cc: Kairui Song <ryncsn@gmail.com> Cc: Kemeng Shi <shikemeng@huaweicloud.com> Cc: Nhat Pham <nphamcs@gmail.com> Cc: Steve French <sfrench@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/page_io.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/mm/page_io.c b/mm/page_io.c
index e4fa7ffffe8b..c984a4023a65 100644
--- a/mm/page_io.c
+++ b/mm/page_io.c
@@ -358,7 +358,16 @@ static void swap_add_folio(struct swap_io_ctx *ctx, struct folio *folio, int rw)
}
bvec_set_folio(&sio->bvecs[sio->nr_bvecs], folio, folio_size(folio), 0);
sio->len += folio_size(folio);
- if (++sio->nr_bvecs == ARRAY_SIZE(sio->bvecs)) {
+
+ /*
+ * Write out the iocb if we filled it, or if the device is synchronous.
+ *
+ * The latter is to work around expectations in the classic LRU code
+ * which make synchronous clearing of the folio writeback flag in the
+ * reclaim path beneficial.
+ */
+ if (++sio->nr_bvecs == ARRAY_SIZE(sio->bvecs) ||
+ (rw == WRITE && (sis->flags & SWP_SYNCHRONOUS_IO))) {
if (rw == WRITE)
swap_write_submit(ctx);
else