[PATCH 31/45] mm/mincore: Create mincore_pud_range to handle PUD-mapped hugetlb vmas
From: Oscar Salvador
Date: Thu Jul 04 2024 - 00:38:53 EST
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