[PATCH] tmp
From: David Hildenbrand (Arm)
Date: Fri Jun 12 2026 - 07:06:00 EST
Signed-off-by: David Hildenbrand (Arm) <david@xxxxxxxxxx>
---
mm/memory.c | 80 +++++++++--------------------------------------------
1 file changed, 13 insertions(+), 67 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index d4b3540ae659..989f7d6b280d 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -519,58 +519,6 @@ static bool is_bad_page_map_ratelimited(void)
return false;
}
-static void __print_bad_page_map_pgtable(struct mm_struct *mm, unsigned long addr)
-{
- unsigned long long pgdv, p4dv, pudv, pmdv;
- p4d_t p4d, *p4dp;
- pud_t pud, *pudp;
- pmd_t pmd, *pmdp;
- pgd_t *pgdp;
-
- /*
- * Although this looks like a fully lockless pgtable walk, it is not:
- * see locking requirements for print_bad_page_map().
- */
- pgdp = pgd_offset(mm, addr);
- pgdv = pgd_val(*pgdp);
-
- if (!pgd_present(*pgdp) || pgd_leaf(*pgdp)) {
- pr_alert("pgd:%08llx\n", pgdv);
- return;
- }
-
- p4dp = p4d_offset(pgdp, addr);
- p4d = p4dp_get(p4dp);
- p4dv = p4d_val(p4d);
-
- if (!p4d_present(p4d) || p4d_leaf(p4d)) {
- pr_alert("pgd:%08llx p4d:%08llx\n", pgdv, p4dv);
- return;
- }
-
- pudp = pud_offset(p4dp, addr);
- pud = pudp_get(pudp);
- pudv = pud_val(pud);
-
- if (!pud_present(pud) || pud_leaf(pud)) {
- pr_alert("pgd:%08llx p4d:%08llx pud:%08llx\n", pgdv, p4dv, pudv);
- return;
- }
-
- pmdp = pmd_offset(pudp, addr);
- pmd = pmdp_get(pmdp);
- pmdv = pmd_val(pmd);
-
- /*
- * Dumping the PTE would be nice, but it's tricky with CONFIG_HIGHPTE,
- * because the table should already be mapped by the caller and
- * doing another map would be bad. print_bad_page_map() should
- * already take care of printing the PTE.
- */
- pr_alert("pgd:%08llx p4d:%08llx pud:%08llx pmd:%08llx\n", pgdv,
- p4dv, pudv, pmdv);
-}
-
/*
* This function is called to print an error when a bad page table entry (e.g.,
* corrupted page table entry) is found. For example, we might have a
@@ -584,8 +532,7 @@ static void __print_bad_page_map_pgtable(struct mm_struct *mm, unsigned long add
* page table lock.
*/
static void print_bad_page_map(struct vm_area_struct *vma,
- unsigned long addr, unsigned long long entry, struct page *page,
- enum pgtable_level level)
+ unsigned long addr, struct page *page, enum pgtable_level level)
{
struct address_space *mapping;
pgoff_t index;
@@ -596,9 +543,8 @@ static void print_bad_page_map(struct vm_area_struct *vma,
mapping = vma->vm_file ? vma->vm_file->f_mapping : NULL;
index = linear_page_index(vma, addr);
- pr_alert("BUG: Bad page map in process %s %s:%08llx", current->comm,
- pgtable_level_to_str(level), entry);
- __print_bad_page_map_pgtable(vma->vm_mm, addr);
+ pr_alert("BUG: Bad page map in process %s on %s level", current->comm,
+ pgtable_level_to_str(level));
if (page)
dump_page(page, "bad page map");
pr_alert("addr:%px vm_flags:%08lx anon_vma:%px mapping:%px index:%lx\n",
@@ -627,8 +573,8 @@ static inline bool pgtable_level_has_pxx_special(enum pgtable_level level)
}
}
-#define print_bad_pte(vma, addr, pte, page) \
- print_bad_page_map(vma, addr, pte_val(pte), page, PGTABLE_LEVEL_PTE)
+#define print_bad_pte(vma, addr, page) \
+ print_bad_page_map(vma, addr, page, PGTABLE_LEVEL_PTE)
/**
* __vm_normal_page() - Get the "struct page" associated with a page table entry.
@@ -697,7 +643,7 @@ static inline bool pgtable_level_has_pxx_special(enum pgtable_level level)
*/
static inline struct page *__vm_normal_page(struct vm_area_struct *vma,
unsigned long addr, unsigned long pfn, bool special,
- unsigned long long entry, enum pgtable_level level)
+ enum pgtable_level level)
{
if (pgtable_level_has_pxx_special(level)) {
if (unlikely(special)) {
@@ -710,7 +656,7 @@ static inline struct page *__vm_normal_page(struct vm_area_struct *vma,
if (is_zero_pfn(pfn) || is_huge_zero_pfn(pfn))
return NULL;
- print_bad_page_map(vma, addr, entry, NULL, level);
+ print_bad_page_map(vma, addr, NULL, level);
return NULL;
}
/*
@@ -741,7 +687,7 @@ static inline struct page *__vm_normal_page(struct vm_area_struct *vma,
if (unlikely(pfn > highest_memmap_pfn)) {
/* Corrupted page table entry. */
- print_bad_page_map(vma, addr, entry, NULL, level);
+ print_bad_page_map(vma, addr, NULL, level);
return NULL;
}
/*
@@ -768,7 +714,7 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
pte_t pte)
{
return __vm_normal_page(vma, addr, pte_pfn(pte), pte_special(pte),
- pte_val(pte), PGTABLE_LEVEL_PTE);
+ PGTABLE_LEVEL_PTE);
}
/**
@@ -810,7 +756,7 @@ struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr,
pmd_t pmd)
{
return __vm_normal_page(vma, addr, pmd_pfn(pmd), pmd_special(pmd),
- pmd_val(pmd), PGTABLE_LEVEL_PMD);
+ PGTABLE_LEVEL_PMD);
}
/**
@@ -851,7 +797,7 @@ struct page *vm_normal_page_pud(struct vm_area_struct *vma,
unsigned long addr, pud_t pud)
{
return __vm_normal_page(vma, addr, pud_pfn(pud), pud_special(pud),
- pud_val(pud), PGTABLE_LEVEL_PUD);
+ PGTABLE_LEVEL_PUD);
}
#endif
@@ -1672,7 +1618,7 @@ static __always_inline void zap_present_folio_ptes(struct mmu_gather *tlb,
folio_remove_rmap_ptes(folio, page, nr, vma);
if (unlikely(folio_mapcount(folio) < 0))
- print_bad_pte(vma, addr, ptent, page);
+ print_bad_pte(vma, addr, page);
}
if (unlikely(__tlb_remove_folio_pages(tlb, page, nr, delay_rmap))) {
*force_flush = true;
@@ -4812,7 +4758,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
} else if (softleaf_is_marker(entry)) {
ret = handle_pte_marker(vmf);
} else {
- print_bad_pte(vma, vmf->address, vmf->orig_pte, NULL);
+ print_bad_pte(vma, vmf->address, NULL);
ret = VM_FAULT_SIGBUS;
}
goto out;
--
2.43.0
--
Cheers,
David