v1 2026-08-08

清理并解除 folio 分割限制 · v1

重构 anon/file folio split 路径,移除 mappingless、高阶、非均匀 folio 的 swapcache 分割限制,降低栈占用且性能不降。

原始补丁链接

子 Patch(13)

1/13
mm/swap: fix off-by-one in swap cache replace sanity check
修复 __swap_cache_replace_folio() DEBUG_VM 检查的 off-by-one:while 先比较后自增导致跳过首个 entry 并越界读一个;改用与替换循环一致的 do-while 区间遍历,避免子 folio order 不同时误报。
2/13
mm/huge_memory: fix rejection of swap cache folios with a mapping
将“swap cache folio 不能 split(shmem mapping)”的检查提前到 folio_check_splittable(),避免在 freeze 并扣减 NR_*_THPS 后才返回 -EINVAL,导致 folio 卡冻结、计数失衡;DEBUG_VM 警告仍保留。
3/13
mm/huge_memory: invert folio_ref_freeze() check to reduce indentation
反转 __folio_freeze_and_split_unmapped() 中 folio_ref_freeze() 成功判断,失败提前返回,成功路径少一层缩进;纯重构,为后续拆分 anon/file 处理做准备。
4/13
mm/huge_memory: split the routine for splitting anon and file folio
将 __folio_freeze_and_split_unmapped() 拆分为 anon 和 file 两个独立例程,避免共享有限导致复杂分支,便于各自演进;拆分中清理冗余检查,无功能变化。
5/13
mm/huge_memory: consolidate irq and locking for folio split
让每个 split helper 自己管理锁和中断,调用方不再负责;__folio_split 去掉局部关中断和 fail 标签,两条拆分路径约定一致。
6/13
mm/huge_memory: move EOF trimming into the file split helper
把 EOF 边界计算和超界页裁剪移入 file split helper,不再由调用方传 end/nr_shmem_dropped,减去冗余参数和 sanity check。
7/13
mm/huge_memory: move unmap and remap into the split helpers
将 unmap/remap 逻辑从 __folio_split 移到各 split helper;只有匿名 folio 需要 remap,remap_page 仅在匿名拆分时调用,其内部 anon 检查可删。
8/13
mm/huge_memory: move anon_vma and filemap management into split helpers
把 anon_vma/vma 相关代码移入匿名拆分 helper,filemap 处理移入文件拆分 helper,让两个拆分路径更加自包含,减少交叉条件。
9/13
mm/huge_memory: move memcg switch into the file split helper
将 memcg 切换从 __folio_split 移入 file split helper,因为其中的 xarray node 分配需要记到 folio 的 memcg;__folio_split 不再有可计费分配,out_no_memcg 改名 out。
10/13
mm/huge_memory: allow splitting mappingless swap cache folios
解除对无 mapping 的 swap cache folio 的拆分限制(可能 anon 或 shmem);但有 mapping 的非 anon swap cache folio 仍拒绝,因需同时更新 page cache 和 swap cache。
11/13
mm/huge_memory: clean up after-split folio freeing in __folio_split
在拆分后的释放循环里改用锁内 folio_free_swap() 加 folio_put(),替代 free_folio_and_swap_cache() 的解锁后 trylock 重检,避免 swap cache 项因竞争残留。
12/13
mm/huge_memory: lift order-0 restriction for swapcache split
取消 swapcache folio 只能 order-0 拆分的旧限制;现在 cluster lock 下的 __swap_cache_replace_folio 可替换任意子 folio 条目,仅因 anon 不支持 order-1 而统一禁止。
13/13
mm/huge_memory: count only swap cache refs in anon folio split
重命名 folio_cache_ref_count 为 folio_swapcache_ref_count 并去掉 anon 判断,只计 swap cache 引用;文件拆分 helper 直接用 folio_nr_pages 表示固定页缓存引用数。