v2
2026-11-11
重构 THP PMD 拆分判定逻辑 · v2
重构 huge PMD 拆分路径:一次读取 PMD、新增辅助函数,并分开处理 present/非 present PMD。
原始补丁链接
子 Patch(9)
1/9
mm/huge_memory: read the huge PMD entry once when splitting it
__split_huge_pmd_locked() 在持有 PMD 页表锁期间只读取一次 *pmd 到 old_pmd,后续分类均基于该快照,避免重复读取同一项;无功能变化。
2/9
mm/huge_memory: add and use huge_zero_pmd_can_split()
新增 huge_zero_pmd_can_split(),在查 folio 前决定大零页 PMD 是否可拆:仅匿名 VMA 拆成共享零页,其余直接解映射,保持原有行为并理顺判断顺序。
3/9
mm/huge_memory: add and use unmap_huge_pmd_entry()
抽出 unmap_huge_pmd_entry() 统一处理不拆分的大 PMD:仅匿名 folio 的 PMD 拆分,其余解映射后由缺页重建;除树内无法产生的异常组合外行为不变。
4/9
mm/huge_memory: use normal_or_softleaf_folio_pmd() in the PMD split path
PMD 拆分路径改用 normal_or_softleaf_folio_pmd() 一次取 folio,并用 vma_has_deposited_pgtable() 判断 deposit,与 zap_huge_pmd() 分类一致,移除 vma_is_mm_managed()。
5/9
mm/huge_memory: dispatch on the folio when splitting a huge PMD
拆分大 PMD 时改为按 folio_test_anon() 选择 anon 重建路径,而不是看 VMA 是否匿名;只有匿名 folio 才有 anon rmap/PageAnonExclusive,NULL folio 直接跳过。
6/9
mm/huge_memory: add and use split_huge_pmd_anon_rmap()
把 present 与 device private 两条路径中重复的 anon-exclusive 处理和 PTE 级 rmap 转换合并为 split_huge_pmd_anon_rmap(),并返回是否仍可能冻结;纯重构无功能变化。
7/9
mm/huge_memory: add struct split_pmd_state
新增 struct split_pmd_state 保存从待拆分 PMD 项读出的状态,把读取与写回路径解耦,避免传递长参数列表;仅重构,无功能变化。
8/9
mm/huge_memory: split present and non-present huge PMDs separately
把共享 PTE 重建逻辑收进 split_huge_pmd_to_ptes(),再拆出 split_present_huge_pmd() 与 split_non_present_huge_pmd(),在 __split_huge_pmd_locked() 中分路径处理;无功能变化。
9/9
mm/huge_memory: unify the migration and device private PTE loops
把安装 migration entry 与 device private entry 的两个非 present PTE 循环合并,由 split_pmd_make_softleaf() 构造叶子项;冻结时仍对 device private 装 migration entry,行为不变。