v3 2026-09-16

可伸缩交换设备 xswap · v3

v3 为 zswap 添加 xswap 支持,含 CONFIG_XSWAP、稀疏 vmalloc 集群增长/收缩、sysfs 和 swapoff/destroy。

原始补丁链接

子 Patch(14)

1/14
mm: xswap support for zswap
引入无后备存储的 xswap 设备,由 zswap 承载页面;新增 nr_real_swapfiles 在 swapon/swapoff 维护,使 zswap 回写门控于存在真实 swap 设备。
2/14
mm, swap: add CONFIG_XSWAP and xswap fields to swap_info_struct
新增 CONFIG_XSWAP,并在 swap_info_struct 加入 cluster_vm、nr_clusters_max、nr_clusters_mapped,为 VM_SPARSE vmalloc 懒扩展 cluster_info 做结构准备。
3/14
mm, swap: refactor free_swap_cluster_info to take swap_info_struct
free_swap_cluster_info() 改收 swap_info_struct*,释放后清空 si->cluster_info 以防 swapon 错误路径双重释放,并便于 xswap 路径读 si->flags。
4/14
mm, swap: add xswap cluster grow via VM_SPARSE vmalloc
用 VM_SPARSE vmalloc 懒加载 xswap 的 cluster_info 数组:按 chunk 映射页,初始仅映射一段,per-device mutex 串行 grow/unmap,失败清理部分映射。
5/14
mm, swap: add sysfs create interface for xswap
新增 xswap/create sysfs,写可选优先级创建无 bdev 设备,初始上限 2×RAM,稀疏映射空闲零成本,休眠扫描跳过。
6/14
mm, swap: add xswap grow trigger on cluster allocation
cluster_alloc_swap_entry() 缺空闲 cluster 时按 XSWAP_GROW_CLUSTERS 扩展映射;映射可睡眠,故临时释放仅保护每 CPU 缓存的 percpu_swap_cluster.lock。
7/14
mm, swap: add xswap_try_shrink and shrink trigger on cluster free
新增 xswap_try_shrink(),在 __free_cluster() 释放 cluster 后,仅当映射范围使用率不高于一半时,回收尾部空闲 cluster 映射,并留一个 chunk 余量。
8/14
mm, swap: free backing pages in xswap_unmap_clusters
修复 xswap_unmap_clusters() 只解映射不释放后备页的泄漏:先收集 PTE 中的页,清 PTE 后释放;收集数组在 no-reclaim 下分配,失败则不动映射。
9/14
mm, swap: defer xswap shrink to workqueue to avoid lock recursion
把 __free_cluster() 中的 xswap_try_shrink() 改由 workqueue 异步执行,避免持 ci->lock 时解映射导致 unlock 访问已 unmap 的地址;swapoff 时取消工作。
10/14
mm, swap: refactor swapoff and add xswap_destroy
从 sys_swapoff() 抽出 __swapoff() 以支持无文件设备,并新增 xswap_destroy() 通过 /sys/kernel/mm/xswap/destroy 按 swap type 拆除设备,需 CAP_SYS_ADMIN。
11/14
mm, swap: require zswap for xswap devices
创建 xswap 时要求 zswap 可用;否则换出只占 swap entry 而无法释放内存页,因此直接失败,避免无效消耗。
12/14
mm, swap: cap xswap growth at nr_clusters
为 xswap cluster_info 扩展增加 si->nr_clusters 上限,初始等于整个地址空间,使后续可按设备限制增长。
13/14
mm, swap: add sysfs per-device size limit for xswap
新增每设备 /sys/kernel/mm/xswap/type/limit,读写可用页数上限;下调时至少覆盖已用页,执行为尽力而为,需 CAP_SYS_ADMIN。
14/14
mm, swap: shrink xswap to the ceiling when it drops
当 limit 下调到低于已映射范围时,直接触发 xswap_try_shrink() 收缩到新上限,不再等下一次 cluster 释放。