From: Wen Jiang <[email protected]>

Extract the common PTE mapping logic from vmap_pte_range() into a
shared helper vmap_set_ptes(). This handles both CONT_PTE and regular
PTE mappings in a single function, preparing for the next patch which
will extend vmap_pages_pte_range() to also use this helper.

No functional change.

Signed-off-by: Wen Jiang <[email protected]>
Tested-by: Xueyuan Chen <[email protected]>
Tested-by: Leo Yan <[email protected]>
---
 mm/vmalloc.c | 36 +++++++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 025b3a848d564..a0508bdb7d36f 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -90,6 +90,29 @@ struct vfree_deferred {
 static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred);
 
 /*** Page table manipulation functions ***/
+
+/*
+ * Try contiguous mappings at the PTE level for arches which support them, and 
if
+ * requested by the caller. Fall back to PAGE_SIZE mappings otherwise.
+ *
+ * Return: mapping size.
+ */
+static __always_inline unsigned long vmap_set_ptes(pte_t *ptep,
+               unsigned long addr, unsigned long end, u64 pfn,
+               pgprot_t prot, unsigned int max_page_shift)
+{
+       unsigned long size;
+
+       size = arch_vmap_pte_range_map_size(addr, end, pfn, max_page_shift);
+       if (size != PAGE_SIZE) {
+               pte_set_huge(ptep, addr, PFN_PHYS(pfn), prot, size);
+               return size;
+       }
+
+       set_pte_at(&init_mm, addr, ptep, pfn_pte(pfn, prot));
+       return PAGE_SIZE;
+}
+
 static int vmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
                        phys_addr_t phys_addr, pgprot_t prot,
                        unsigned int max_page_shift, pgtbl_mod_mask *mask)
@@ -98,6 +121,7 @@ static int vmap_pte_range(pmd_t *pmd, unsigned long addr, 
unsigned long end,
        u64 pfn;
        struct page *page;
        unsigned long size;
+       unsigned int steps;
 
        if (WARN_ON_ONCE(!PAGE_ALIGNED(end - addr)))
                return -EINVAL;
@@ -118,15 +142,9 @@ static int vmap_pte_range(pmd_t *pmd, unsigned long addr, 
unsigned long end,
                        BUG();
                }
 
-               size = arch_vmap_pte_range_map_size(addr, end, pfn, 
max_page_shift);
-               if (size != PAGE_SIZE) {
-                       pte_set_huge(pte, addr, PFN_PHYS(pfn), prot, size);
-                       pfn += PFN_DOWN(size);
-                       continue;
-               }
-               set_pte_at(&init_mm, addr, pte, pfn_pte(pfn, prot));
-               pfn++;
-       } while (pte += PFN_DOWN(size), addr += size, addr != end);
+               size = vmap_set_ptes(pte, addr, end, pfn, prot, max_page_shift);
+               steps = PFN_DOWN(size);
+       } while (pte += steps, pfn += steps, addr += size, addr != end);
 
        lazy_mmu_mode_disable();
        *mask |= PGTBL_PTE_MODIFIED;
-- 
2.34.1


Reply via email to