v2
2026-11-12
修复大PFN映射缺页竞态 · v2
修复 VM_PFNMAP 同时提供 fault 和 huge_fault 时,THP 策略在缺页中被改变导致同址 PTE 与 PMD 叶子并发安装或回退的竞态。
原始补丁链接
子 Patch(4)
1/4
mm: drop the huge PMD assertion from walk_to_pmd()
删除 walk_to_pmd() 的 huge PMD 断言:并发 huge fault 可在 VM_PFNMAP 上装入 PMD leaf,pmd_alloc 不覆盖,调用者经 pte_offset_map_lock 得 NULL 已处理。
2/4
mm: don't report OOM when a huge PMD race blocks a pfn insert
insert_pfn 拆开 pte_alloc_map_lock,仅在页表分配失败返回 VM_FAULT_OOM;PMD leaf 导致映射 NULL 时返回 VM_FAULT_NOPAGE 重试,不再误报 OOM。
3/4
mm/huge_memory: don't warn when a page table blocks a huge pfn insert
insert_pmd/insert_pud 仅对 leaf 比较 PFN;并发 order-0 fault 装入页表时不再误报 warning,走 out_unlock 返回 VM_FAULT_NOPAGE,让访问重试到小页。
4/4
mm/huge_memory: use the large-page PAT encoding for huge pfn mappings
huge pfn 路径用 pgprot_4k_2_large 把 PTE 的 PAT 编码转成 PMD/PUD 大页编码,修正 x86 上 WT/WP 因 PAT 位位置不同而丢失缓存或写保护。