v2
2026-11-12
khugepaged collapse_file() 清理 · v2
重构 khugepaged 的 collapse_file:拆分 folio 读取、脏页回写及隔离逻辑。
原始补丁链接
子 Patch(8)
1/8
mm/khugepaged: separate out windy folio logic from collapse_file
将 collapse_file() 中复杂的 folio 处理抽成独立辅助函数,并用新结构体传递参数,降低主循环复杂度,为后续重构铺路,无功能变化。
2/8
mm/khugepaged: sanitize the folio passed to file folio collapse logic
在 collapse_file() 循环顶部把 xarray 中的 NULL 与 xa_value(shadow/swap entry)统一为 NULL,使 prepare_collapse_file() 只需处理真实 folio,简化读逻辑,无功能变化。
3/8
mm/khugepaged: factor out page cache folio reading
将普通文件 do_readahead 与 shmem_get_folio 两套读入路径合并为 maybe_read_folio(),供 shmem/filemap 共用,减少 collapse_file() 中重复的预读与取 folio 逻辑。
4/8
mm/khugepaged: factor out and simplify dirty/writeback handling
合并 collapse_file() 中脏页/回写页处理分支,在 !is_shmem 下统一检查 folio dirty/writeback,因 shmem 不受脏页回收阻碍;同时整理注释,减少重复代码。
5/8
mm/khugepaged: simplify prepare folio locking and exit paths
在 prepare_collapse_file() 中统一 shmem/filemap 的 folio_trylock()+folio_get() 路径,明确退出时 xarray 锁已释放、成功返回锁定且持有引用的 folio,并删除 goto 简化错误路径。
6/8
mm/khugepaged: hoist isolation into collapse_isolate_folio()
将 collapse_file() 主循环中的 folio 隔离逻辑移入 collapse_isolate_folio(),并调整 try_to_unmap_flush() 仅在需要时调用;隔离失败路径不再提前 flush,功能基本不变。
7/8
mm/khugepaged: hoist more code into collapse_isolate_folio()
把预期引用计数与脏页检查从 i_pages 锁保护的主循环移到 collapse_isolate_folio();这些检查依赖 RCU/folio_try_get 和 folio lock,并不需要 xarray 锁,减少锁持有范围。
8/8
mm/khugepaged: flesh out try_to_unmap_flush() comment
扩展 collapse_file() 中 try_to_unmap_flush() 相关注释,说明 try_to_unmap 批处理、flush 时机与后续释放引用/锁之间的正确性约束,无代码功能变化。