[RFC PATCH 10/34] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot()
Yeoreum Yun
yeoreum.yun at arm.com
Mon Jul 13 06:55:49 PDT 2026
From: "David Hildenbrand (Arm)" <david at kernel.org>
We want to change how pXdp_get() works with generic compile-time folded
page tables. To prepare for that, rework effective_prot() to ignore any
folded page tables entries, as it will unconditionally get called by
ptdump core with pXd_val(pXdp_get()), and we really should be ignoring
that value for folded entries.
For this, identify the first real page-table level and
update effective_prot only when the current entry is not folded.
There should be no functional change.
Signed-off-by: Yeoreum Yun <yeoreum.yun at arm.com>
---
arch/x86/mm/dump_pagetables.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c
index 2afa7a23340e9..e32848c7f26d4 100644
--- a/arch/x86/mm/dump_pagetables.c
+++ b/arch/x86/mm/dump_pagetables.c
@@ -27,6 +27,7 @@
*/
struct pg_state {
struct ptdump_state ptdump;
+ struct mm_struct *mm;
int level;
pgprotval_t current_prot;
pgprotval_t effective_prot;
@@ -253,8 +254,22 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val)
struct pg_state *st = container_of(pt_st, struct pg_state, ptdump);
pgprotval_t prot = val & PTE_FLAGS_MASK;
pgprotval_t effective;
+ bool first_level = false;
- if (level > 0) {
+ /* Ignore folded levels ... */
+ if (((level == 0) && mm_p4d_folded(st->mm)) ||
+ ((level == 1) && mm_pud_folded(st->mm)) ||
+ ((level == 2) && mm_pmd_folded(st->mm)))
+ return;
+
+ /* ... and make the actual first level remember the protection. */
+ if (((level == 0)) ||
+ ((level == 1) && mm_p4d_folded(st->mm)) ||
+ ((level == 2) && mm_pud_folded(st->mm)) ||
+ ((level == 3) && mm_pmd_folded(st->mm)))
+ first_level = true;
+
+ if (!first_level) {
pgprotval_t higher_prot = st->prot_levels[level - 1];
effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) |
@@ -449,6 +464,7 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m,
.effective_prot_pgd = effective_prot_pgd,
.range = ptdump_ranges
},
+ .mm = mm,
.level = -1,
.to_dmesg = dmesg,
.check_wx = checkwx,
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
More information about the kvm-riscv
mailing list