v2
2026-09-10
拆分 collapse 引擎与调用者 · v2
Kiryl Shutsemau 重构 khugepaged/collapse,移除冗余 mm pin,重命名位图,新增 collapse.h 并拆分扫描与合并。
原始补丁链接
子 Patch(12)
1/12
mm/khugepaged: drop redundant mm_struct pin in madvise_collapse()
madvise_collapse() 的 mmgrab()/mmdrop() 冗余,因为 madvise、process_madvise(mm_access)、io_uring、DAMON 调用者都已持 mm_users,删除该引用计数对。
2/12
mm/khugepaged: count collapses where khugepaged makes them
把 khugepaged_pages_collapsed 计数从 collapse_single_pmd() 移到 khugepaged 守护进程自身,去掉 cc->is_khugepaged 判断,避免 MADV_COLLAPSE 路径误增计数器。
3/12
mm/khugepaged: rename mthp_present_ptes bitmap to eligible_ptes
将 mthp_present_ptes 位图改名为 eligible_ptes,因其置位表示 PTE 已通过 uffd、lazyfree、匿名、共享等检查可作 collapse 源,而非仅 present,并更新注释。
4/12
mm/collapse: add collapse.h for the collapse interface
新建 mm/collapse.h,把 enum scan_result、struct collapse_control 及 COLLAPSE_MAX_PTES_LIMIT、COLLAPSE_MIN_MTHP_ORDER 移入,划分 khugepaged 使用方与 collapse 引擎接口,无功能变化。
5/12
mm/collapse: state what a collapse may do in the policy
引入 struct collapse_policy 由调用者填写,把散落的 cc->is_khugepaged 判断改为读策略字段,明确 collapse 允许的 VMA 资格、PTE 限制等行为。
6/12
mm/collapse: drop the collapse_possible() wrapper
删除 collapse_possible() 包装,其只转发 collapse_possible_orders() 并将 mask 转 bool,三个调用者直接判断 mask,无功能变化。
7/12
mm/collapse: name the per-table scan reset for what it resets
将 collapse_control_init_scan() 更名为 collapse_scan_reset(),它实为每个 PTE 表扫描前重置 node load、分配 nodemask 和 eligible-PTE 位图,为 control 级 init/release 让路。
8/12
mm/collapse: separate scanning a PTE table from collapsing it
将 collapse_single_pmd() 拆为只读扫描的 collapse_scan_pmd()/collapse_scan_anon_pmd() 与执行收缩的 collapse_run_pmd(),中间释放 mmap_lock,结果经 collapse_control 传递。
9/12
mm/collapse: open-code collapse_single_pmd() in its two callers
在两个调用者中展开 collapse_single_pmd(),各自持锁扫描后于 SCAN_SUCCEED 释放 mmap_lock 再运行 collapse,去掉 lock_dropped/mmap_unlocked 返回值,明确锁边界。
10/12
mm/collapse: work out the orders a VMA allows once per VMA
每个 VMA 只调用一次 collapse_possible_orders() 得到 order mask 并传入逐表扫描,madvise_collapse() 每次 collapse 后重取,thp 设置变更晚一 VMA 生效且 revalidate 会复检。
11/12
mm/collapse: declare the collapse interface in collapse.h
在 collapse.h 声明 collapse_control_init/scan_pmd/run_pmd/release 及 collapse_possible_orders(),注明调用顺序与锁约束;hugepage_vma_revalidate() 改名 collapse_vma_revalidate(),为 madvise 实现铺路。
12/12
mm/collapse: implement MADV_COLLAPSE in madvise.c
将 MADV_COLLAPSE 的区间遍历、逐 PMD 循环和 errno 转换从 khugepaged.c 移入 madvise.c,改用 struct madvise_behavior 传参,collapse 逻辑不变。