Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1d9cfee

Browse files
Anshuman Khandualtorvalds
Anshuman Khandual
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 memoryranges on arm64. But before that, it enables vmemmap_populate_basepages()and vmemmap_alloc_block_buf() to accommodate struct vmem_altmap basedalocation requests.This patch (of 3):vmemmap_populate_basepages() is used across platforms to allocate backingmemory for vmemmap mapping. This is used as a standard default choice oras a fallback when intended huge pages allocation fails. This justcreates entire vmemmap mapping with base pages (PAGE_SIZE).On arm64 platforms, vmemmap_populate_basepages() is called instead of theplatform specific vmemmap_populate() when ARM64_SWAPPER_USES_SECTION_MAPSis not enabled as in case for ARM64_16K_PAGES and ARM64_64K_PAGES configs.At present vmemmap_populate_basepages() does not support allocating fromdriver defined struct vmem_altmap while trying to create vmemmap mappingfor a device memory range. It prevents ARM64_16K_PAGES andARM64_64K_PAGES configs on arm64 from supporting device memory withvmemap_altmap request.This enables vmem_altmap support in vmemmap_populate_basepages() unlockingdevice memory allocation for vmemap mapping on arm64 platforms with 16K or64K base page configs.Each architecture should evaluate and decide on subscribing device memorybased base page allocation through vmemmap_populate_basepages(). Hencelets keep it disabled on all archs in order to preserve the existingsemantics. A subsequent patch enables it on arm64.Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>Signed-off-by: Andrew Morton <akpm@linux-foundation.org>Tested-by: Jia He <justin.he@arm.com>Reviewed-by: David Hildenbrand <david@redhat.com>Acked-by: Will Deacon <will@kernel.org>Acked-by: Catalin Marinas <catalin.marinas@arm.com>Cc: Mark Rutland <mark.rutland@arm.com>Cc: Paul Walmsley <paul.walmsley@sifive.com>Cc: Palmer Dabbelt <palmer@dabbelt.com>Cc: Tony Luck <tony.luck@intel.com>Cc: Fenghua Yu <fenghua.yu@intel.com>Cc: Dave Hansen <dave.hansen@linux.intel.com>Cc: Andy Lutomirski <luto@kernel.org>Cc: Peter Zijlstra <peterz@infradead.org>Cc: Thomas Gleixner <tglx@linutronix.de>Cc: Ingo Molnar <mingo@redhat.com>Cc: Mike Rapoport <rppt@linux.ibm.com>Cc: Michal Hocko <mhocko@suse.com>Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>Cc: Dan Williams <dan.j.williams@intel.com>Cc: Pavel Tatashin <pasha.tatashin@soleen.com>Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>Cc: Borislav Petkov <bp@alien8.de>Cc: "H. Peter Anvin" <hpa@zytor.com>Cc: Hsin-Yi Wang <hsinyi@chromium.org>Cc: Jonathan Corbet <corbet@lwn.net>Cc: Michael Ellerman <mpe@ellerman.id.au>Cc: Paul Mackerras <paulus@samba.org>Cc: Robin Murphy <robin.murphy@arm.com>Cc: Steve Capper <steve.capper@arm.com>Cc: Yu Zhao <yuzhao@google.com>Link:http://lkml.kernel.org/r/1594004178-8861-1-git-send-email-anshuman.khandual@arm.comLink:http://lkml.kernel.org/r/1594004178-8861-2-git-send-email-anshuman.khandual@arm.comSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent56f3547 commit1d9cfee

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__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,
10711071
structvmem_altmap*altmap)
10721072
{
1073-
returnvmemmap_populate_basepages(start,end,node);
1073+
returnvmemmap_populate_basepages(start,end,node,NULL);
10741074
}
10751075
#else/* !ARM64_SWAPPER_USES_SECTION_MAPS */
10761076
int__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,

‎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__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,
656656
structvmem_altmap*altmap)
657657
{
658-
returnvmemmap_populate_basepages(start,end,node);
658+
returnvmemmap_populate_basepages(start,end,node,NULL);
659659
}
660660

661661
voidvmemmap_free(unsigned longstart,unsigned longend,

‎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__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,
555555
structvmem_altmap*altmap)
556556
{
557-
returnvmemmap_populate_basepages(start,end,node);
557+
returnvmemmap_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
return0;
@@ -1557,15 +1557,15 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
15571557
interr;
15581558

15591559
if (end-start<PAGES_PER_SECTION*sizeof(structpage))
1560-
err=vmemmap_populate_basepages(start,end,node);
1560+
err=vmemmap_populate_basepages(start,end,node,NULL);
15611561
elseif (boot_cpu_has(X86_FEATURE_PSE))
15621562
err=vmemmap_populate_hugepages(start,end,node,altmap);
15631563
elseif (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
returnerr;

‎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 longaddr,intnode);
29792979
pud_t*vmemmap_pud_populate(p4d_t*p4d,unsigned longaddr,intnode);
29802980
pmd_t*vmemmap_pmd_populate(pud_t*pud,unsigned longaddr,intnode);
2981-
pte_t*vmemmap_pte_populate(pmd_t*pmd,unsigned longaddr,intnode);
2981+
pte_t*vmemmap_pte_populate(pmd_t*pmd,unsigned longaddr,intnode,
2982+
structvmem_altmap*altmap);
29822983
void*vmemmap_alloc_block(unsigned longsize,intnode);
29832984
structvmem_altmap;
29842985
void*vmemmap_alloc_block_buf(unsigned longsize,intnode);
29852986
void*altmap_alloc_block_buf(unsigned longsize,structvmem_altmap*altmap);
29862987
voidvmemmap_verify(pte_t*,int,unsigned long,unsigned long);
29872988
intvmemmap_populate_basepages(unsigned longstart,unsigned longend,
2988-
intnode);
2989+
intnode,structvmem_altmap*altmap);
29892990
intvmemmap_populate(unsigned longstart,unsigned longend,intnode,
29902991
structvmem_altmap*altmap);
29912992
voidvmemmap_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*__meminitvmemmap_pte_populate(pmd_t*pmd,unsignedlongaddr,intnode)
142+
pte_t*__meminitvmemmap_pte_populate(pmd_t*pmd,unsignedlongaddr,intnode,
143+
structvmem_altmap*altmap)
143144
{
144145
pte_t*pte=pte_offset_kernel(pmd,addr);
145146
if (pte_none(*pte)) {
146147
pte_tentry;
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
returnNULL;
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
returnpgd;
213219
}
214220

215-
int__meminitvmemmap_populate_basepages(unsigned longstart,
216-
unsigned longend,intnode)
221+
int__meminitvmemmap_populate_basepages(unsigned longstart,unsigned longend,
222+
intnode,structvmem_altmap*altmap)
217223
{
218224
unsigned longaddr=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)

[8]ページ先頭

©2009-2025 Movatter.jp