[PATCH 0/2] mm: zswap: free cold writeback folios promptly
From: Alexandre Ghiti
Date: Sat Jul 18 2026 - 05:37:53 EST
When zswap writes an entry back, it allocates an order-0 swap cache folio,
decompresses into it, and issues the write. The folio is cold by
construction, yet today it is left on the LRU for page reclaim to find and
free later. That wastes a reclaim scan and keeps cold memory resident
longer than necessary.
Free the folio as soon as writeback completes instead:
Patch 1 - synchronous-IO devices (zram, brd, pmem, ...) complete writeback
in the calling context, so the folio is freed directly there.
Patch 2 - asynchronous block devices and filesystem-backed swap complete
writeback in IRQ/softirq context, where the folio cannot be
freed (that needs the folio and swap cluster locks and may
sleep). Allocate the folio off the LRU and defer the free to a
workqueue, which folio_end_writeback() hands it off to.
Results
-------
Paired baseline vs series on async swap (NVMe, Patch 2 deferred path). Each
workload runs confined to a memory cgroup (memory.max) small enough to force
zswap shrinker writeback.
Kernel build (defconfig, make -j4; memory.max = 600M):
metric baseline series delta
pgrotated 441028 2521 -99.4%
pgsteal_direct 3524343 2869004 -18.6%
pgscan_direct 8393791 7765008 -7.5%
zswpwb 705129 699019 -0.9%
build time (s) 1155 1114 -3.6%
Of the 699019 folios written back, 698990 (99.996%) were freed promptly on
writeback completion; only 28 fell back to reclaim.
MySQL/OLTP (sysbench, 10 tables x 1M rows, 512M buffer pool, 8 threads, 300s;
memory.max = 256M):
metric baseline series delta
transactions/s 153.87 163.30 +6.1%
p95 latency (ms) 157.42 145.82 -7.4%
avg latency (ms) 52.09 49.05 -5.9%
pgrotated 743738 22460 -97.0%
pgsteal_direct 6886490 5445278 -20.9%
pgscan_direct 13462510 10820730 -19.6%
Alexandre Ghiti (2):
mm: zswap: free synchronous-IO writeback folios directly
mm: zswap: deferred dropbehind free of writeback folios
include/linux/zswap.h | 2 ++
mm/filemap.c | 20 +++++++++++++
mm/swap.h | 3 +-
mm/swap_state.c | 17 +++++++----
mm/zswap.c | 66 +++++++++++++++++++++++++++++++++++++++++--
5 files changed, 98 insertions(+), 10 deletions(-)
base-commit: 626acb37cd445144f321f1b64cac9a93760fa716
--
2.53.0-Meta