Normal THP cannot be PUD-mapped (besides devmap), but hugetlb can, so create mincore_pud_range in order to handle PUD-mapped hugetlb vmas. Signed-off-by: Oscar Salvador <osalvador@xxxxxxx> --- mm/mincore.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mm/mincore.c b/mm/mincore.c index 5154bc705f60..786df7246899 100644 --- a/mm/mincore.c +++ b/mm/mincore.c @@ -98,6 +98,25 @@ static int mincore_unmapped_range(unsigned long addr, unsigned long end, return 0; } +static int mincore_pud_range(pud_t *pud, unsigned long addr, unsigned long end, + struct mm_walk *walk) +{ +#ifdef CONFIG_PGTABLE_HAS_HUGE_LEAVES + spinlock_t *ptl; + unsigned char *vec = walk->private; + int nr = (end - addr) >> PAGE_SHIFT; + struct vm_area_struct *vma = walk->vma; + + ptl = pud_huge_lock(pud, vma); + if (!ptl) + return 0; + + memset(vec, 1, nr); + spin_unlock(ptl); +#endif + return 0; +} + static int mincore_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { @@ -175,6 +194,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_range, .pmd_entry = mincore_pte_range, .pte_hole = mincore_unmapped_range, .hugetlb_entry = mincore_hugetlb, -- 2.26.2