v3 2026-09-16

拆分 collapse 引擎与调用者 · v3

v3 重构 khugepaged/collapse,去掉冗余 mm pin、重命名 eligible_ptes,并分离 PTE 扫描与折叠。

原始补丁链接

子 Patch(12)

1/12
mm/khugepaged: drop redundant mm_struct pin in madvise_collapse()
删除 madvise_collapse() 中多余的 mmgrab()/mmdrop();所有调用方如 madvise、process_madvise、io_uring、DAMON 都已持 mm_users,无需额外 pin。
2/12
mm/khugepaged: count collapses where khugepaged makes them
将 khugepaged_pages_collapsed 计数移到守护线程自身,去掉 collapse_single_pmd() 的 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 来源,注释同步更新。
4/12
mm/collapse: add collapse.h for the collapse interface
新建 mm/collapse.h,把 enum scan_result、struct collapse_control 与 KHUGEPAGED_* 常量移出 khugepaged.c,划清 collapse 引擎和调用方接口。
5/12
mm/collapse: state what a collapse may do in the policy
新增 struct collapse_policy,由 khugepaged 或 MADV_COLLAPSE 填好 VMA 资格、空闲/换出/共享 PTE 上限、dirty 重试等策略;collapse 路径不再读 is_khugepaged。
6/12
mm/collapse: drop the collapse_possible() wrapper
删除 collapse_possible() 包装,三个调用者直接判断 collapse_possible_orders() 返回的 order 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 位图,而非初始化整个 control。
8/12
mm/collapse: separate scanning a PTE table from collapsing it
拆分 collapse_single_pmd():collapse_scan_pmd() 在 mmap_lock 下只读扫描 anon/file 表,collapse_run_pmd() 在放锁后分配、隔离、拷贝并 flush,明确两阶段边界。
9/12
mm/collapse: open-code collapse_single_pmd() in its two callers
把 collapse_single_pmd() 展开到 khugepaged 与 madvise_collapse() 两个调用者;扫描持读锁、collapse 前显式放锁,删除 lock_dropped/mmap_unlocked 状态标志。
10/12
mm/collapse: work out the orders a VMA allows once per VMA
将 collapse_possible_orders() 从每张 PTE 表调用提升为每个 VMA 计算一次并传入 mask;madvise 在 collapse 后重新采样,revalidate 仍在锁下校验 order。
11/12
mm/collapse: declare the collapse interface in collapse.h
在 collapse.h 声明 collapse_control_init/scan_pmd/run_pmd/release、collapse_possible_orders 及 collapse_vma_revalidate,为 madvise.c 实现 MADV_COLLAPSE 暴露统一接口。
12/12
mm/collapse: implement MADV_COLLAPSE in madvise.c
把 MADV_COLLAPSE 的范围遍历、按 PMD 循环、errno 转换和 policy 从 khugepaged.c 迁到 madvise.c,改用 madvise_behavior 参数,仍调用同一 collapse 接口。