vmemmap_populate_basepages() is used for vmemmap mapping across platforms.
On arm64 it is used for ARM64_16K_PAGES and ARM64_64K_PAGES configs. When
applicable enable it's allocation from device memory range through struct
vmem_altpamp. Individual archs should enable this when appropriate. Hence
keep it disabled to continue with the existing semantics.

Signed-off-by: Anshuman Khandual <anshuman.khand...@arm.com>
---
 arch/arm64/mm/mmu.c      |  2 +-
 arch/ia64/mm/discontig.c |  2 +-
 arch/x86/mm/init_64.c    |  4 ++--
 include/linux/mm.h       |  5 +++--
 mm/sparse-vmemmap.c      | 14 ++++++++++----
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 4b25b7544763..2859aa89cc4a 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -921,7 +921,7 @@ remove_pagetable(unsigned long start, unsigned long end,
 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int 
node,
                struct vmem_altmap *altmap)
 {
-       return vmemmap_populate_basepages(start, end, node);
+       return vmemmap_populate_basepages(start, end, node, NULL);
 }
 #else  /* !ARM64_SWAPPER_USES_SECTION_MAPS */
 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int 
node,
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
index 05490dd073e6..faefd7ec991f 100644
--- a/arch/ia64/mm/discontig.c
+++ b/arch/ia64/mm/discontig.c
@@ -660,7 +660,7 @@ void arch_refresh_nodedata(int update_node, pg_data_t 
*update_pgdat)
 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int 
node,
                struct vmem_altmap *altmap)
 {
-       return vmemmap_populate_basepages(start, end, node);
+       return vmemmap_populate_basepages(start, end, node, NULL);
 }
 
 void vmemmap_free(unsigned long start, unsigned long end,
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index bccff68e3267..e7e05d1b8bcf 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1450,7 +1450,7 @@ static int __meminit vmemmap_populate_hugepages(unsigned 
long start,
                        vmemmap_verify((pte_t *)pmd, node, addr, next);
                        continue;
                }
-               if (vmemmap_populate_basepages(addr, next, node))
+               if (vmemmap_populate_basepages(addr, next, node, NULL))
                        return -ENOMEM;
        }
        return 0;
@@ -1468,7 +1468,7 @@ int __meminit vmemmap_populate(unsigned long start, 
unsigned long end, int node,
                                __func__);
                err = -ENOMEM;
        } else
-               err = vmemmap_populate_basepages(start, end, node);
+               err = vmemmap_populate_basepages(start, end, node, NULL);
        if (!err)
                sync_global_pgds(start, end - 1);
        return err;
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 76769749b5a5..a62e9ff24af3 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2672,14 +2672,15 @@ pgd_t *vmemmap_pgd_populate(unsigned long addr, int 
node);
 p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
 pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
 pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
-pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
+pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
+                                       struct vmem_altmap *altmap);
 void *vmemmap_alloc_block(unsigned long size, int node);
 struct vmem_altmap;
 void *vmemmap_alloc_block_buf(unsigned long size, int node);
 void *altmap_alloc_block_buf(unsigned long size, struct vmem_altmap *altmap);
 void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
 int vmemmap_populate_basepages(unsigned long start, unsigned long end,
-                              int node);
+                              int node, struct vmem_altmap *altmap);
 int vmemmap_populate(unsigned long start, unsigned long end, int node,
                struct vmem_altmap *altmap);
 void vmemmap_populate_print_last(void);
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index 7fec05796796..81a0960b5cd4 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -140,12 +140,18 @@ void __meminit vmemmap_verify(pte_t *pte, int node,
                        start, end - 1);
 }
 
-pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int 
node)
+pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int 
node,
+                               struct vmem_altmap *altmap)
 {
        pte_t *pte = pte_offset_kernel(pmd, addr);
        if (pte_none(*pte)) {
                pte_t entry;
-               void *p = vmemmap_alloc_block_buf(PAGE_SIZE, node);
+               void *p;
+
+               if (altmap)
+                       p = altmap_alloc_block_buf(PAGE_SIZE, altmap);
+               else
+                       p = vmemmap_alloc_block_buf(PAGE_SIZE, node);
                if (!p)
                        return NULL;
                entry = pfn_pte(__pa(p) >> PAGE_SHIFT, PAGE_KERNEL);
@@ -214,7 +220,7 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, 
int node)
 }
 
 int __meminit vmemmap_populate_basepages(unsigned long start,
-                                        unsigned long end, int node)
+                       unsigned long end, int node, struct vmem_altmap *altmap)
 {
        unsigned long addr = start;
        pgd_t *pgd;
@@ -236,7 +242,7 @@ int __meminit vmemmap_populate_basepages(unsigned long 
start,
                pmd = vmemmap_pmd_populate(pud, addr, node);
                if (!pmd)
                        return -ENOMEM;
-               pte = vmemmap_pte_populate(pmd, addr, node);
+               pte = vmemmap_pte_populate(pmd, addr, node, altmap);
                if (!pte)
                        return -ENOMEM;
                vmemmap_verify(pte, node, addr, addr + PAGE_SIZE);
-- 
2.20.1

Reply via email to