Preparatory patch, no functional change intended. To prepare for making this function more generic, convert the boolean "create" arg into a flags arg with a single flag that has the same meaning. Signed-off-by: Brendan Jackman --- mm/internal.h | 10 ++++++++++ mm/memory.c | 29 +++++++++++++++++------------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/mm/internal.h b/mm/internal.h index f98f4746ac412..4b389431b1639 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1870,4 +1870,14 @@ static inline int get_sysctl_max_map_count(void) return READ_ONCE(sysctl_max_map_count); } +/* + * Create a mapping if it doesn't exist. (Otherwise, skip regions with no + * existing mapping, and return an error for regions with no leaf pagetable). + */ +#define PGRANGE_CREATE (1 << 0) + +int __apply_to_page_range(struct mm_struct *mm, unsigned long addr, + unsigned long size, pte_fn_t fn, + void *data, unsigned int flags); + #endif /* __MM_INTERNAL_H */ diff --git a/mm/memory.c b/mm/memory.c index 219b9bf6cae00..7e55014e5560b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3208,9 +3208,10 @@ EXPORT_SYMBOL(vm_iomap_memory); static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, unsigned long addr, unsigned long end, - pte_fn_t fn, void *data, bool create, + pte_fn_t fn, void *data, unsigned int flags, pgtbl_mod_mask *mask) { + bool create = flags & PGRANGE_CREATE; pte_t *pte, *mapped_pte; int err = 0; spinlock_t *ptl; @@ -3251,10 +3252,11 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, static int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud, unsigned long addr, unsigned long end, - pte_fn_t fn, void *data, bool create, + pte_fn_t fn, void *data, unsigned int flags, pgtbl_mod_mask *mask) { pmd_t *pmd; + bool create = flags & PGRANGE_CREATE; unsigned long next; int err = 0; @@ -3279,7 +3281,7 @@ static int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud, pmd_clear_bad(pmd); } err = apply_to_pte_range(mm, pmd, addr, next, - fn, data, create, mask); + fn, data, flags, mask); if (err) break; } while (pmd++, addr = next, addr != end); @@ -3289,10 +3291,11 @@ static int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud, static int apply_to_pud_range(struct mm_struct *mm, p4d_t *p4d, unsigned long addr, unsigned long end, - pte_fn_t fn, void *data, bool create, + pte_fn_t fn, void *data, unsigned int flags, pgtbl_mod_mask *mask) { pud_t *pud; + bool create = flags & PGRANGE_CREATE; unsigned long next; int err = 0; @@ -3325,10 +3328,11 @@ static int apply_to_pud_range(struct mm_struct *mm, p4d_t *p4d, static int apply_to_p4d_range(struct mm_struct *mm, pgd_t *pgd, unsigned long addr, unsigned long end, - pte_fn_t fn, void *data, bool create, + pte_fn_t fn, void *data, unsigned int flags, pgtbl_mod_mask *mask) { p4d_t *p4d; + bool create = flags & PGRANGE_CREATE; unsigned long next; int err = 0; @@ -3351,7 +3355,7 @@ static int apply_to_p4d_range(struct mm_struct *mm, pgd_t *pgd, p4d_clear_bad(p4d); } err = apply_to_pud_range(mm, p4d, addr, next, - fn, data, create, mask); + fn, data, flags, mask); if (err) break; } while (p4d++, addr = next, addr != end); @@ -3359,11 +3363,12 @@ static int apply_to_p4d_range(struct mm_struct *mm, pgd_t *pgd, return err; } -static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr, - unsigned long size, pte_fn_t fn, - void *data, bool create) +int __apply_to_page_range(struct mm_struct *mm, unsigned long addr, + unsigned long size, pte_fn_t fn, + void *data, unsigned int flags) { pgd_t *pgd; + bool create = flags & PGRANGE_CREATE; unsigned long start = addr, next; unsigned long end = addr + size; pgtbl_mod_mask mask = 0; @@ -3387,7 +3392,7 @@ static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr, pgd_clear_bad(pgd); } err = apply_to_p4d_range(mm, pgd, addr, next, - fn, data, create, &mask); + fn, data, flags, &mask); if (err) break; } while (pgd++, addr = next, addr != end); @@ -3405,7 +3410,7 @@ static int __apply_to_page_range(struct mm_struct *mm, unsigned long addr, int apply_to_page_range(struct mm_struct *mm, unsigned long addr, unsigned long size, pte_fn_t fn, void *data) { - return __apply_to_page_range(mm, addr, size, fn, data, true); + return __apply_to_page_range(mm, addr, size, fn, data, PGRANGE_CREATE); } EXPORT_SYMBOL_GPL(apply_to_page_range); @@ -3419,7 +3424,7 @@ EXPORT_SYMBOL_GPL(apply_to_page_range); int apply_to_existing_page_range(struct mm_struct *mm, unsigned long addr, unsigned long size, pte_fn_t fn, void *data) { - return __apply_to_page_range(mm, addr, size, fn, data, false); + return __apply_to_page_range(mm, addr, size, fn, data, 0); } /* -- 2.51.2