v2
2026-08-05
动态簇管理虚拟交换 · v2
为 zswap 引入 xswap:新增配置与 swap_info 字段、cluster 增长/收缩、O(1) shrink 检测及 workqueue 延迟释放。
原始补丁链接
子 Patch(10)
1/10
mm: xswap support for zswap
On Wed, Aug 05, 2026 at 03:53:24PM +0800, Baoquan He wrote: > From: Chris Li chrisl@kernel.org > > Introduce extendable (virtual) swap device support ??? xswap. > > The current zswap requires a ba
2/10
mm, swap: add CONFIG_XSWAP and xswap fields to swap_info_struct
新增 CONFIG_XSWAP 及 swap_info_struct 中 cluster_vm/nr_clusters/nr_clusters_mapped 字段,支持基于 VM_SPARSE vmalloc 的 cluster_info 数组惰性映射管理。
3/10
mm, swap: add xswap cluster grow via VM_SPARSE vmalloc
实现 xswap 的 cluster_info 数组按需增长:用 VM_SPARSE vmalloc 预留 KVA,通过 vm_area_map_pages/unmap_pages 映射/解映射物理页,并用 memalloc_noreclaim_save 等避免消耗紧急预留。
4/10
mm, swap: add xswap grow trigger on cluster allocation
cluster_alloc_swap_entry() 分配失败且仍可增长时,调用 xswap_map_clusters() 映射 XSWAP_GROW_CLUSTERS 个 cluster 加入 free_clusters,然后重试分配,透明扩展交换空间。
5/10
mm, swap: add xswap_try_shrink and shrink trigger on cluster free
新增 xswap_try_shrink(),在 __free_cluster() 释放 cluster 后触发,从尾部反向扫描连续空闲簇,累积达阈值即 unmap 整页,回收 xswap 后备内存。
6/10
mm, swap: free backing pages in xswap_unmap_clusters
修复 xswap_unmap_clusters() 只清 PTE 未释放后备页:先用 apply_to_existing_page_range() 收集 struct page,vunmap_range() 后逐个 __free_page(),避免内存泄漏。
7/10
mm, swap: add nr_free_tail for O(1) xswap shrink detection
在 swap_info_struct 增加 nr_free_tail 记录尾部连续空闲 cluster 数,alloc/free/grow 三路径维护,使 xswap_try_shrink() 退化为 O(1) 阈值判断,无需每次反向扫描。
8/10
mm, swap: add adjustable runtime ceiling (nr_clusters) for xswap
将 xswap 上限拆为不可变 nr_clusters_max 和可调 nr_clusters;收缩按当前 ceiling 触发,默认 nr_clusters==max 时只增长不收缩。
9/10
mm, swap: add debugfs knob for xswap per-device cluster limit
新增 debugfs 接口 /sys/kernel/debug/xswap/type_cluster_limit,运行时读写 nr_clusters 并 clamp,写入低于已映射值即触发 xswap_try_shrink(),swapon/swapoff 创建/移除。
10/10
mm, swap: defer xswap shrink to workqueue to avoid lock recursion
将 xswap_try_shrink() 从 __free_cluster() 直接调用改为 schedule_work() 延迟执行,避免持有 ci->lock 时 unmap 导致 swap_cluster_unlock 访问失效地址;swapoff 用 cancel_work_sync() 防并发。