v1
2026-11-04
折叠页表 pXd 获取行为改造 · v1
为折叠页表新增 pXd_leaf/offset_lockless 辅助并移除 pXd_offset 栈拷贝,避免 ptep_get 等强制 READ_ONCE 开销。
原始补丁链接
子 Patch(21)
1/21
ARM: mm: make nommu pgd_t a scalar
ARM nommu 下 pgd_t 原为数组,但会被 pgdp_get() 等按值返回;改为 u32 标量,避免类型不合法,nommu 无真实页表仅满足编译器。
2/21
ARM: mm: make 2-level pgd_t a scalar
ARM 二级页表将 pgd_t 从数组改为 u64 标量,pgd_val() 中提取对应 32 位值,使 pgdp_get() 返回 pgd_t 合法;STRICT_MM_TYPECHECKS 暂不处理。
3/21
ARM: mm: remove custom pgdp_get()
pgd_t 改为标量后,删除 ARM 自定义 pgdp_get(),改用通用 pgdp_get() 内联函数,避免重复实现并统一页表访问。
4/21
LoongArch: mm: define pud_leaf() only when PUD exists
LoongArch 仅当未定义 __PAGETABLE_PMD_FOLDED 时定义 pud_leaf(),避免折叠页表下架构定义与 asm-generic 默认实现冲突,为后续修复铺路。
5/21
MIPS: mm: define pud_leaf() only when PUD exists
MIPS 同样只在 __PAGETABLE_PMD_FOLDED 未定义时定义 pud_leaf(),与 LoongArch 一致,防止折叠层级下 pud_leaf 定义冲突,为通用头文件修复做准备。
6/21
mm/pgtable: define (pgd|p4d|pud)_leaf() for folded page tables
在 pgtable-nop4d/nopmd/nopud 中为折叠层级定义 pgd/p4d/pud_leaf() 为 false,补齐缺失的 pud_leaf 并防止架构误覆盖,保持类型检查。
7/21
mm/pgtable: define (pgd|p4d|pud)_offset_lockless() for folded page tables
为折叠页表新增 pgd/p4d/pud_offset_lockless(),忽略传入的折叠层级值,不再像默认实现那样对栈副本取地址;删除 arm64 自定义实现。
8/21
mm: vmscan: remove stack copy address of pud/pmd pass in walk_pud/pmd_range()
vmscan 中 walk_pud/pmd_range 不再传栈拷贝的 pud/pmd 地址,而是直接传指针,适配 pXdp_get() 折叠语义,避免 pXd_same() 误判并发访问。
9/21
loongarch: kvm: remove stack copy address of pXd in pXd_offset()
LoongArch KVM 的 host_pfn_mapping_level() 改为用 pXd_offset_lockless() 并直接传页表指针,避免把栈拷贝的折叠 pXd 传给 offset,适配新语义。
10/21
riscv: kvm: remove stack copy address of pXd in pXd_offset()
RISC-V KVM 的 get_hva_mapping_size() 改用 pXd_offset_lockless() 直接传页表指针,不再依赖栈拷贝的 pXd,为通用编译期折叠页表做准备。
11/21
riscv: mm: use proper set_pXd() for generic compile-time folded patable in vmalloc_fault()
RISC-V vmalloc_fault() 中折叠层级不能对 pXdp_get() 结果调用 set_pXd(),改为配对使用第一级 set_pXd(),确保 pXd_present() 检查折叠项正确。
12/21
mm/pgtable: redefine PGTABLE_LEVEL enum with ascend order from PGD
将 PGTABLE_LEVEL 枚举从 PTE 为 0 反转为 PGD 为 0、向 PTE 递增,符合页表遍历方向;当前无代码依赖旧数值,仅统一语义。
13/21
x86/mm: Introduce helper for checking direct map 1G page support
x86 新增 helper 检查 direct map 1G 支持,先看 X86_DIRECT_GBPAGES 与 CPU 能力再读 direct_gbpages,让编译期禁用时死代码可见,避免折叠页表检查构建失败。
14/21
x86: mm: use pgtable_level enum in effective_prot_pXd()
x86 effective_prot_pXd() 用 pgtable_level 枚举替代硬编码层级数字,提供类型安全,并为后续采用 mm_first_pgtable_level() 等通用 helper 做准备。
15/21
x86: mm: carve out the generic compile-time folded pgtable case in effective_prot()
x86 effective_prot() 引入 mm_first_pgtable_level() 并识别 mm_pXd_folded(),仅在非折叠且非首层时更新 higher_prot,避免 ptdump 对折叠项取值误判。
16/21
openrisc/pgtable: drop __pmd_offset()
From: “David Hildenbrand (Arm)” david@kernel.org The macro is unused, and will collide with a folded page table helper. Let’s just remove it. Signed-off-by: David Hildenbrand (Arm) <david@kernel.o
17/21
mm/pgtable: optimize pmdp_get() and friends for folded pagetable levels
From: “David Hildenbrand (Arm)” david@kernel.org Using pmdp_get() and friends in common code on a kernel config with folded page tables is suboptimal: they default to a READ_ONCE(), forcing the com
18/21
mm/pgtable: catch abuse of folded dummy pgd_t/p4d_t/pud_t
From: “David Hildenbrand (Arm)” david@kernel.org Catch and prevent all abuse with dummy values on the stack similar to: pud_t pud = pudp_get(pudp); pmd_t *pmdp = pud_offset(*pud, addr); While t
19/21
mm/pgtable: disallow calling (pgd|p4d|pud)_page, pgd_page_vaddr() and (p4d|pud)_pgtable with dummy
From: “David Hildenbrand (Arm)” david@kernel.org These helpers silently fallback to the folded helpers. With e.g., pdgp_get() returning dummy values, pgd_page_vaddr(pgdp_get(pgdp)) will now behave
20/21
mm/pgtable: disallow calling folded set_pgd/set_p4d/set_pud with dummy
From: “David Hildenbrand (Arm)” david@kernel.org pXdp_get() could return a dummy value for a page-table level folded at compile time. Passing this value to set_pXd() could cause unexpected behavior
21/21
Documentation: mm: clarify behaviour of compile-time folded page tables
From: “David Hildenbrand (Arm)” david@kernel.org Compile-time folded page tables are not necessarily easy to understand, and even people the were once familiar with the concept might need to refres