In 2009, we converted a VM_BUG_ON(!pfn_valid(pfn)) to the current highest_memmap_pfn sanity check in commit 22b31eec63e5 ("badpage: vm_normal_page use print_bad_pte"), because highest_memmap_pfn was readily available.
Nowadays, this is the last remaining highest_memmap_pfn user, and this sanity check is not really triggering ... frequently. Let's convert it to VM_WARN_ON_ONCE(!pfn_valid(pfn)), so we can simplify and get rid of highest_memmap_pfn. Checking for pfn_to_online_page() might be even better, but it would not handle ZONE_DEVICE properly. Do the same in vm_normal_page_pmd(), where we don't even report a problem at all ... What might be better in the future is having a runtime option like page-table-check to enable such checks dynamically on-demand. Something for the future. Signed-off-by: David Hildenbrand <da...@redhat.com> --- mm/memory.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 0163d127cece9..188b84ebf479a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -590,7 +590,7 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, if (IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) { if (likely(!pte_special(pte))) - goto check_pfn; + goto out; if (vma->vm_ops && vma->vm_ops->find_special_page) return vma->vm_ops->find_special_page(vma, addr); if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) @@ -608,9 +608,6 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, if (vma->vm_flags & VM_MIXEDMAP) { if (!pfn_valid(pfn)) return NULL; - if (is_zero_pfn(pfn)) - return NULL; - goto out; } else { unsigned long off; off = (addr - vma->vm_start) >> PAGE_SHIFT; @@ -624,17 +621,12 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, if (is_zero_pfn(pfn)) return NULL; -check_pfn: - if (unlikely(pfn > highest_memmap_pfn)) { - print_bad_pte(vma, addr, pte, NULL); - return NULL; - } - /* * NOTE! We still have PageReserved() pages in the page tables. * eg. VDSO mappings can cause them to exist. */ out: + VM_WARN_ON_ONCE(!pfn_valid(pfn)); VM_WARN_ON_ONCE(is_zero_pfn(pfn)); return pfn_to_page(pfn); } @@ -676,14 +668,13 @@ struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr, if (is_huge_zero_pmd(pmd)) return NULL; - if (unlikely(pfn > highest_memmap_pfn)) - return NULL; /* * NOTE! We still have PageReserved() pages in the page tables. * eg. VDSO mappings can cause them to exist. */ out: + VM_WARN_ON_ONCE(!pfn_valid(pfn)); return pfn_to_page(pfn); } -- 2.49.0