Skip to content

Commit 1d9cfee

Browse files
Anshuman Khandualtorvalds
authored andcommitted
mm/sparsemem: enable vmem_altmap support in vmemmap_populate_basepages()
Patch series "arm64: Enable vmemmap mapping from device memory", v4. This series enables vmemmap backing memory allocation from device memory ranges on arm64. But before that, it enables vmemmap_populate_basepages() and vmemmap_alloc_block_buf() to accommodate struct vmem_altmap based alocation requests. This patch (of 3): vmemmap_populate_basepages() is used across platforms to allocate backing memory for vmemmap mapping. This is used as a standard default choice or as a fallback when intended huge pages allocation fails. This just creates entire vmemmap mapping with base pages (PAGE_SIZE). On arm64 platforms, vmemmap_populate_basepages() is called instead of the platform specific vmemmap_populate() when ARM64_SWAPPER_USES_SECTION_MAPS is not enabled as in case for ARM64_16K_PAGES and ARM64_64K_PAGES configs. At present vmemmap_populate_basepages() does not support allocating from driver defined struct vmem_altmap while trying to create vmemmap mapping for a device memory range. It prevents ARM64_16K_PAGES and ARM64_64K_PAGES configs on arm64 from supporting device memory with vmemap_altmap request. This enables vmem_altmap support in vmemmap_populate_basepages() unlocking device memory allocation for vmemap mapping on arm64 platforms with 16K or 64K base page configs. Each architecture should evaluate and decide on subscribing device memory based base page allocation through vmemmap_populate_basepages(). Hence lets keep it disabled on all archs in order to preserve the existing semantics. A subsequent patch enables it on arm64. Signed-off-by: Anshuman Khandual <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Tested-by: Jia He <[email protected]> Reviewed-by: David Hildenbrand <[email protected]> Acked-by: Will Deacon <[email protected]> Acked-by: Catalin Marinas <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Paul Walmsley <[email protected]> Cc: Palmer Dabbelt <[email protected]> Cc: Tony Luck <[email protected]> Cc: Fenghua Yu <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Michal Hocko <[email protected]> Cc: "Matthew Wilcox (Oracle)" <[email protected]> Cc: "Kirill A. Shutemov" <[email protected]> Cc: Dan Williams <[email protected]> Cc: Pavel Tatashin <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: Hsin-Yi Wang <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Robin Murphy <[email protected]> Cc: Steve Capper <[email protected]> Cc: Yu Zhao <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 56f3547 commit 1d9cfee

File tree

6 files changed

+20
-13
lines changed

6 files changed

+20
-13
lines changed

arch/arm64/mm/mmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ static void free_empty_tables(unsigned long addr, unsigned long end,
10701070
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
10711071
struct vmem_altmap *altmap)
10721072
{
1073-
return vmemmap_populate_basepages(start, end, node);
1073+
return vmemmap_populate_basepages(start, end, node, NULL);
10741074
}
10751075
#else /* !ARM64_SWAPPER_USES_SECTION_MAPS */
10761076
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,

arch/ia64/mm/discontig.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)
655655
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
656656
struct vmem_altmap *altmap)
657657
{
658-
return vmemmap_populate_basepages(start, end, node);
658+
return vmemmap_populate_basepages(start, end, node, NULL);
659659
}
660660

661661
void vmemmap_free(unsigned long start, unsigned long end,

arch/riscv/mm/init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,6 @@ void __init paging_init(void)
554554
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
555555
struct vmem_altmap *altmap)
556556
{
557-
return vmemmap_populate_basepages(start, end, node);
557+
return vmemmap_populate_basepages(start, end, node, NULL);
558558
}
559559
#endif

arch/x86/mm/init_64.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,7 @@ static int __meminit vmemmap_populate_hugepages(unsigned long start,
15451545
vmemmap_verify((pte_t *)pmd, node, addr, next);
15461546
continue;
15471547
}
1548-
if (vmemmap_populate_basepages(addr, next, node))
1548+
if (vmemmap_populate_basepages(addr, next, node, NULL))
15491549
return -ENOMEM;
15501550
}
15511551
return 0;
@@ -1557,15 +1557,15 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
15571557
int err;
15581558

15591559
if (end - start < PAGES_PER_SECTION * sizeof(struct page))
1560-
err = vmemmap_populate_basepages(start, end, node);
1560+
err = vmemmap_populate_basepages(start, end, node, NULL);
15611561
else if (boot_cpu_has(X86_FEATURE_PSE))
15621562
err = vmemmap_populate_hugepages(start, end, node, altmap);
15631563
else if (altmap) {
15641564
pr_err_once("%s: no cpu support for altmap allocations\n",
15651565
__func__);
15661566
err = -ENOMEM;
15671567
} else
1568-
err = vmemmap_populate_basepages(start, end, node);
1568+
err = vmemmap_populate_basepages(start, end, node, NULL);
15691569
if (!err)
15701570
sync_global_pgds(start, end - 1);
15711571
return err;

include/linux/mm.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2978,14 +2978,15 @@ pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
29782978
p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
29792979
pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
29802980
pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
2981-
pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node);
2981+
pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
2982+
struct vmem_altmap *altmap);
29822983
void *vmemmap_alloc_block(unsigned long size, int node);
29832984
struct vmem_altmap;
29842985
void *vmemmap_alloc_block_buf(unsigned long size, int node);
29852986
void *altmap_alloc_block_buf(unsigned long size, struct vmem_altmap *altmap);
29862987
void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
29872988
int vmemmap_populate_basepages(unsigned long start, unsigned long end,
2988-
int node);
2989+
int node, struct vmem_altmap *altmap);
29892990
int vmemmap_populate(unsigned long start, unsigned long end, int node,
29902991
struct vmem_altmap *altmap);
29912992
void vmemmap_populate_print_last(void);

mm/sparse-vmemmap.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,18 @@ void __meminit vmemmap_verify(pte_t *pte, int node,
139139
start, end - 1);
140140
}
141141

142-
pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node)
142+
pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
143+
struct vmem_altmap *altmap)
143144
{
144145
pte_t *pte = pte_offset_kernel(pmd, addr);
145146
if (pte_none(*pte)) {
146147
pte_t entry;
147-
void *p = vmemmap_alloc_block_buf(PAGE_SIZE, node);
148+
void *p;
149+
150+
if (altmap)
151+
p = altmap_alloc_block_buf(PAGE_SIZE, altmap);
152+
else
153+
p = vmemmap_alloc_block_buf(PAGE_SIZE, node);
148154
if (!p)
149155
return NULL;
150156
entry = pfn_pte(__pa(p) >> PAGE_SHIFT, PAGE_KERNEL);
@@ -212,8 +218,8 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
212218
return pgd;
213219
}
214220

215-
int __meminit vmemmap_populate_basepages(unsigned long start,
216-
unsigned long end, int node)
221+
int __meminit vmemmap_populate_basepages(unsigned long start, unsigned long end,
222+
int node, struct vmem_altmap *altmap)
217223
{
218224
unsigned long addr = start;
219225
pgd_t *pgd;
@@ -235,7 +241,7 @@ int __meminit vmemmap_populate_basepages(unsigned long start,
235241
pmd = vmemmap_pmd_populate(pud, addr, node);
236242
if (!pmd)
237243
return -ENOMEM;
238-
pte = vmemmap_pte_populate(pmd, addr, node);
244+
pte = vmemmap_pte_populate(pmd, addr, node, altmap);
239245
if (!pte)
240246
return -ENOMEM;
241247
vmemmap_verify(pte, node, addr, addr + PAGE_SIZE);

0 commit comments

Comments
 (0)