diff --git a/mm/mincore.c b/mm/mincore.c index 53b982803771..d9d4381d7ed4 100644 --- a/mm/mincore.c +++ b/mm/mincore.c @@ -160,6 +160,20 @@ static int mincore_unmapped_range(unsigned long addr, unsigned long end, return 0; } +static int mincore_pud_entry(pud_t *pudp, unsigned long addr, unsigned long end, + struct mm_walk *walk) +{ + if (pud_is_huge(pudp_get(pudp))) { + const unsigned long nr = (end - addr) >> PAGE_SHIFT; + + memset(walk->private, 1, nr); + walk->private += nr; + walk->action = ACTION_CONTINUE; + } + + return 0; +} + static int mincore_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { @@ -232,6 +246,7 @@ static inline bool can_do_mincore(struct vm_area_struct *vma) } static const struct mm_walk_ops mincore_walk_ops = { + .pud_entry = mincore_pud_entry, .pmd_entry = mincore_pte_range, .pte_hole = mincore_unmapped_range, .hugetlb_entry = mincore_hugetlb, @@ -259,14 +274,6 @@ static long do_mincore(unsigned long addr, unsigned long pages, unsigned char *v return pages; } - /* - * mincore historically reports PFNMAP mappings as non-resident. - */ - if (vma->vm_flags & VM_PFNMAP) { - __mincore_unmapped_range(addr, end, vma, vec); - return (end - addr) >> PAGE_SHIFT; - } - err = walk_page_range_vma(vma, addr, end, &mincore_walk_ops, vec); if (err < 0) return err;