v1
2026-09-29
zswap 回写适配 iocost 限流 · v1
zswap 回写改用 REQ_BACKGROUND 受 IO 节流,并移到 per-lruvec kworker,避免在缺页路径睡眠。
原始补丁链接
子 Patch(4)
1/4
block: do not issue background swap bios as root
bio_issue_as_root_blkg() 把 REQ_SWAP bio 一律按 root 发出以绕过 cgroup IO 限流;让 REQ_BACKGROUND 额外取消该豁免,同时保留 REQ_SWAP 以维持 dm-crypt/dm-thin 的 limit_swap_bios,当前无调用者改变行为。
2/4
mm/zswap: turn shrink_memcg_cb()'s argument into a flags word
把 shrink_memcg_cb() 的 bool 指针参数改为 flags 字指针:仍能上报遍历因条目已在 swap cache 而中止,同时为调用方传入额外标志留出空间,无功能变化。
3/4
mm/zswap: allow writeback to be throttled by the cgroup IO controllers
zswap 回写改用 REQ_BACKGROUND,不再被 bio_issue_as_root_blkg() 豁免,从而受所属 cgroup 的 IO 预算节流,避免插队阻塞工作负载依赖的同步 swapin 与 page cache 读;相应调整 page_io.c 与 swap_ops。
4/4
mm/zswap: move reclaim-driven writeback to a kworker
把 shrinker 触发的 zswap 回写从 page fault/kswapd 上下文移到 shrink_wq kworker:每个 lruvec 一个 work、持 memcg 引用、每次回写 SWAP_CLUSTER_MAX 条,避免新引入的 cgroup IO 限流在回收路径上不可中断等待,worker 未领取前不重复排队。