diff --git a/mm/vmscan.c b/mm/vmscan.c index 9dd8977de5a2..041f9ad8f95b 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3230,7 +3230,8 @@ static bool get_next_vma(unsigned long mask, unsigned long size, struct mm_walk return false; } -static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr) +static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr, + struct page *page) { unsigned long pfn = pte_pfn(pte); @@ -3239,8 +3240,14 @@ static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned if (!pte_present(pte) || is_zero_pfn(pfn)) return -1; - if (WARN_ON_ONCE(pte_devmap(pte) || pte_special(pte))) + if (pte_devmap(pte) || pte_special(pte)) { + if (page) + dump_page(page, "get_pte_pfn()"); + dump_vma(vma); + dump_mm(vma->vm_mm); + BUG(); return -1; + } if (WARN_ON_ONCE(!pfn_valid(pfn))) return -1; @@ -3331,7 +3338,7 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end, total++; walk->mm_stats[MM_LEAF_TOTAL]++; - pfn = get_pte_pfn(ptent, args->vma, addr); + pfn = get_pte_pfn(ptent, args->vma, addr, NULL); if (pfn == -1) continue; @@ -3998,7 +4005,7 @@ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw) unsigned long pfn; pte_t ptent = ptep_get(pte + i); - pfn = get_pte_pfn(ptent, pvmw->vma, addr); + pfn = get_pte_pfn(ptent, pvmw->vma, addr, pfn_to_page(pvmw->pfn)); if (pfn == -1) continue;