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

Commiteee0793

Browse files
Anshuman Khandualtorvalds
Anshuman Khandual
authored andcommitted
arm64/mm: enable vmem_altmap support for vmemmap mappings
Device memory ranges when getting hot added into ZONE_DEVICE, mightrequire their vmemmap mapping's backing memory to be allocated from theirown range instead of consuming system memory. This prevents large systemmemory usage for potentially large device memory ranges. Device drivercommunicates this request via vmem_altmap structure. Architecture needsto take this request into account while creating and tearing down vemmmapmappings.This enables vmem_altmap support in vmemmap_populate() and vmemmap_free()which includes vmemmap_populate_basepages() used for ARM64_16K_PAGES andARM64_64K_PAGES configs.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: Catalin Marinas <catalin.marinas@arm.com>Cc: Will Deacon <will@kernel.org>Cc: Mark Rutland <mark.rutland@arm.com>Cc: Steve Capper <steve.capper@arm.com>Cc: David Hildenbrand <david@redhat.com>Cc: Yu Zhao <yuzhao@google.com>Cc: Hsin-Yi Wang <hsinyi@chromium.org>Cc: Thomas Gleixner <tglx@linutronix.de>Cc: Andy Lutomirski <luto@kernel.org>Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>Cc: Borislav Petkov <bp@alien8.de>Cc: Dan Williams <dan.j.williams@intel.com>Cc: Dave Hansen <dave.hansen@linux.intel.com>Cc: Fenghua Yu <fenghua.yu@intel.com>Cc: "H. Peter Anvin" <hpa@zytor.com>Cc: Ingo Molnar <mingo@redhat.com>Cc: Jonathan Corbet <corbet@lwn.net>Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>Cc: Michael Ellerman <mpe@ellerman.id.au>Cc: Michal Hocko <mhocko@suse.com>Cc: Mike Rapoport <rppt@linux.ibm.com>Cc: Palmer Dabbelt <palmer@dabbelt.com>Cc: Paul Mackerras <paulus@samba.org>Cc: Paul Walmsley <paul.walmsley@sifive.com>Cc: Pavel Tatashin <pasha.tatashin@soleen.com>Cc: Peter Zijlstra <peterz@infradead.org>Cc: Robin Murphy <robin.murphy@arm.com>Cc: Tony Luck <tony.luck@intel.com>Link:http://lkml.kernel.org/r/1594004178-8861-4-git-send-email-anshuman.khandual@arm.comSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent56993b4 commiteee0793

File tree

1 file changed

+38
-20
lines changed

1 file changed

+38
-20
lines changed

‎arch/arm64/mm/mmu.c‎

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -761,15 +761,20 @@ int kern_addr_valid(unsigned long addr)
761761
}
762762

763763
#ifdefCONFIG_MEMORY_HOTPLUG
764-
staticvoidfree_hotplug_page_range(structpage*page,size_tsize)
764+
staticvoidfree_hotplug_page_range(structpage*page,size_tsize,
765+
structvmem_altmap*altmap)
765766
{
766-
WARN_ON(PageReserved(page));
767-
free_pages((unsigned long)page_address(page),get_order(size));
767+
if (altmap) {
768+
vmem_altmap_free(altmap,size >>PAGE_SHIFT);
769+
}else {
770+
WARN_ON(PageReserved(page));
771+
free_pages((unsigned long)page_address(page),get_order(size));
772+
}
768773
}
769774

770775
staticvoidfree_hotplug_pgtable_page(structpage*page)
771776
{
772-
free_hotplug_page_range(page,PAGE_SIZE);
777+
free_hotplug_page_range(page,PAGE_SIZE,NULL);
773778
}
774779

775780
staticboolpgtable_range_aligned(unsigned longstart,unsigned longend,
@@ -792,7 +797,8 @@ static bool pgtable_range_aligned(unsigned long start, unsigned long end,
792797
}
793798

794799
staticvoidunmap_hotplug_pte_range(pmd_t*pmdp,unsigned longaddr,
795-
unsigned longend,boolfree_mapped)
800+
unsigned longend,boolfree_mapped,
801+
structvmem_altmap*altmap)
796802
{
797803
pte_t*ptep,pte;
798804

@@ -806,12 +812,14 @@ static void unmap_hotplug_pte_range(pmd_t *pmdp, unsigned long addr,
806812
pte_clear(&init_mm,addr,ptep);
807813
flush_tlb_kernel_range(addr,addr+PAGE_SIZE);
808814
if (free_mapped)
809-
free_hotplug_page_range(pte_page(pte),PAGE_SIZE);
815+
free_hotplug_page_range(pte_page(pte),
816+
PAGE_SIZE,altmap);
810817
}while (addr+=PAGE_SIZE,addr<end);
811818
}
812819

813820
staticvoidunmap_hotplug_pmd_range(pud_t*pudp,unsigned longaddr,
814-
unsigned longend,boolfree_mapped)
821+
unsigned longend,boolfree_mapped,
822+
structvmem_altmap*altmap)
815823
{
816824
unsigned longnext;
817825
pmd_t*pmdp,pmd;
@@ -834,16 +842,17 @@ static void unmap_hotplug_pmd_range(pud_t *pudp, unsigned long addr,
834842
flush_tlb_kernel_range(addr,addr+PAGE_SIZE);
835843
if (free_mapped)
836844
free_hotplug_page_range(pmd_page(pmd),
837-
PMD_SIZE);
845+
PMD_SIZE,altmap);
838846
continue;
839847
}
840848
WARN_ON(!pmd_table(pmd));
841-
unmap_hotplug_pte_range(pmdp,addr,next,free_mapped);
849+
unmap_hotplug_pte_range(pmdp,addr,next,free_mapped,altmap);
842850
}while (addr=next,addr<end);
843851
}
844852

845853
staticvoidunmap_hotplug_pud_range(p4d_t*p4dp,unsigned longaddr,
846-
unsigned longend,boolfree_mapped)
854+
unsigned longend,boolfree_mapped,
855+
structvmem_altmap*altmap)
847856
{
848857
unsigned longnext;
849858
pud_t*pudp,pud;
@@ -866,16 +875,17 @@ static void unmap_hotplug_pud_range(p4d_t *p4dp, unsigned long addr,
866875
flush_tlb_kernel_range(addr,addr+PAGE_SIZE);
867876
if (free_mapped)
868877
free_hotplug_page_range(pud_page(pud),
869-
PUD_SIZE);
878+
PUD_SIZE,altmap);
870879
continue;
871880
}
872881
WARN_ON(!pud_table(pud));
873-
unmap_hotplug_pmd_range(pudp,addr,next,free_mapped);
882+
unmap_hotplug_pmd_range(pudp,addr,next,free_mapped,altmap);
874883
}while (addr=next,addr<end);
875884
}
876885

877886
staticvoidunmap_hotplug_p4d_range(pgd_t*pgdp,unsigned longaddr,
878-
unsigned longend,boolfree_mapped)
887+
unsigned longend,boolfree_mapped,
888+
structvmem_altmap*altmap)
879889
{
880890
unsigned longnext;
881891
p4d_t*p4dp,p4d;
@@ -888,16 +898,24 @@ static void unmap_hotplug_p4d_range(pgd_t *pgdp, unsigned long addr,
888898
continue;
889899

890900
WARN_ON(!p4d_present(p4d));
891-
unmap_hotplug_pud_range(p4dp,addr,next,free_mapped);
901+
unmap_hotplug_pud_range(p4dp,addr,next,free_mapped,altmap);
892902
}while (addr=next,addr<end);
893903
}
894904

895905
staticvoidunmap_hotplug_range(unsigned longaddr,unsigned longend,
896-
boolfree_mapped)
906+
boolfree_mapped,structvmem_altmap*altmap)
897907
{
898908
unsigned longnext;
899909
pgd_t*pgdp,pgd;
900910

911+
/*
912+
* altmap can only be used as vmemmap mapping backing memory.
913+
* In case the backing memory itself is not being freed, then
914+
* altmap is irrelevant. Warn about this inconsistency when
915+
* encountered.
916+
*/
917+
WARN_ON(!free_mapped&&altmap);
918+
901919
do {
902920
next=pgd_addr_end(addr,end);
903921
pgdp=pgd_offset_k(addr);
@@ -906,7 +924,7 @@ static void unmap_hotplug_range(unsigned long addr, unsigned long end,
906924
continue;
907925

908926
WARN_ON(!pgd_present(pgd));
909-
unmap_hotplug_p4d_range(pgdp,addr,next,free_mapped);
927+
unmap_hotplug_p4d_range(pgdp,addr,next,free_mapped,altmap);
910928
}while (addr=next,addr<end);
911929
}
912930

@@ -1070,7 +1088,7 @@ static void free_empty_tables(unsigned long addr, unsigned long end,
10701088
int__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,
10711089
structvmem_altmap*altmap)
10721090
{
1073-
returnvmemmap_populate_basepages(start,end,node,NULL);
1091+
returnvmemmap_populate_basepages(start,end,node,altmap);
10741092
}
10751093
#else/* !ARM64_SWAPPER_USES_SECTION_MAPS */
10761094
int__meminitvmemmap_populate(unsigned longstart,unsigned longend,intnode,
@@ -1102,7 +1120,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
11021120
if (pmd_none(READ_ONCE(*pmdp))) {
11031121
void*p=NULL;
11041122

1105-
p=vmemmap_alloc_block_buf(PMD_SIZE,node,NULL);
1123+
p=vmemmap_alloc_block_buf(PMD_SIZE,node,altmap);
11061124
if (!p)
11071125
return-ENOMEM;
11081126

@@ -1120,7 +1138,7 @@ void vmemmap_free(unsigned long start, unsigned long end,
11201138
#ifdefCONFIG_MEMORY_HOTPLUG
11211139
WARN_ON((start<VMEMMAP_START)|| (end>VMEMMAP_END));
11221140

1123-
unmap_hotplug_range(start,end, true);
1141+
unmap_hotplug_range(start,end, true,altmap);
11241142
free_empty_tables(start,end,VMEMMAP_START,VMEMMAP_END);
11251143
#endif
11261144
}
@@ -1411,7 +1429,7 @@ static void __remove_pgd_mapping(pgd_t *pgdir, unsigned long start, u64 size)
14111429
WARN_ON(pgdir!=init_mm.pgd);
14121430
WARN_ON((start<PAGE_OFFSET)|| (end>PAGE_END));
14131431

1414-
unmap_hotplug_range(start,end, false);
1432+
unmap_hotplug_range(start,end, false,NULL);
14151433
free_empty_tables(start,end,PAGE_OFFSET,PAGE_END);
14161434
}
14171435

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp