v1
2026-07-28
动态簇管理虚拟交换 · v1
推出虚拟交换设备xswap,动态增长收缩集群,由zswap后端支持无写回。
原始补丁链接
子 Patch(11)
1/11
mm: xswap support for zswap
引入可扩展虚拟交换设备xswap,仅包含swap头无数据区,bdev置NULL强制写失败,zswap写回在全部xswap时禁用,减少swapfile空间浪费。
2/11
mm, swap: add CONFIG_XSWAP and xswap fields to swap_info_struct
添加CONFIG_XSWAP及swap_info_struct中cluster_vm/nr_clusters/nr_clusters_mapped字段,用于xswap设备懒分配稀疏vmalloc集群区。
3/11
mm, swap: add xswap cluster grow via VM_SPARSE vmalloc
实现xswap集群动态增长:xswap_map_clusters()通过VM_SPARSE的vm_area_map_pages()映射物理页,setup_swap_clusters_info()预保留虚拟空间,swapoff时清理。
4/11
mm, swap: add xswap grow trigger on cluster allocation
在cluster_alloc_swap_entry()失败时触发xswap增长,调用xswap_map_clusters()分配新集群加入free_clusters,透明扩展xswap容量。
5/11
mm, swap: add xswap_try_shrink and shrink trigger on cluster free
实现xswap_try_shrink()放缩:在__free_cluster()释放集群后,若尾部连续空闲簇≥XSWAP_GROW_CLUSTERS则触发回收,释放物理页。
6/11
mm, swap: free backing pages in xswap_unmap_clusters
修正xswap_unmap_clusters():在vunmap前用apply_to_existing_page_range()收集并释放PTE指向的物理页,确保内存真正回收。
7/11
mm, swap: add nr_free_tail for O(1) xswap shrink detection
引入nr_free_tail计数器维护尾部连续空闲簇数量,O(1)判断收缩条件,alloc/free/grow路径同步更新,避免扫描开销。
8/11
mm, swap: add adjustable runtime ceiling (nr_clusters) for xswap
拆分nr_clusters为固定上限nr_clusters_max和运行时天花板nr_clusters,增长/收缩均以此为准,默认等于最大值(不收缩),可运行时调节。
9/11
mm, swap: add debugfs knob for xswap per-device cluster limit
添加debugfs接口/sys/kernel/debug/xswap/type_cluster_limit,可运行时读写单个xswap设备的集群上限,降低触发即时收缩。
10/11
mm, swap: defer xswap shrink to workqueue to avoid lock recursion
将xswap收缩移到workqueue执行,避免在__free_cluster()持有ci->lock时调用xswap_unmap_clusters()导致锁递归及页表失效后崩溃。
11/11
mm, swap: serialize xswap map/unmap with a mutex
使用per-device互斥锁xswap_lock序列化vm_area_map_pages/vm_area_unmap_pages操作,防止并发增长触发WARN_ON(!pte_none)。