arm64/mm: add fallback option to allocate virtually
PATCH v3 1/1 arm64/mm: add fallback option to allocate virtually
V1: The initial patch used the approach to abort at the first instance of PMD_SIZE allocation failure, unmaps all previously mapped sections using vmemmap_free and maps the entire request with vmemmap_populate_basepages to allocate virtually contiguous memory.
https://lkml.org/lkml/2020/9/10/66
V2: Allocates virtually contiguous memory only for sections that failed PMD_SIZE allocation, and continues to allocate physically contiguous memory for other sections.
https://lkml.org/lkml/2020/9/30/1489
V3: Addresses Anshuman's comment to allow fallback to altmap base pages as well if and when required.
Sudarshan Rajagopalan (1):
arm64/mm: add fallback option to allocate virtually contiguous memory
arch/arm64/mm/mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v3 1/1 arm64/mm: add fallback option to allocate virtually contiguous memory
When section mappings are enabled, we allocate vmemmap pages from physically continuous memory of size PMD_SIZE using vmemmap_alloc_block_buf(). Section mappings are good to reduce TLB pressure. But when system is highly fragmented and memory blocks are being hot-added at runtime, its possible that such physically continuous memory allocations can fail. Rather than failing the memory hot-add procedure, add a fallback option to allocate vmemmap pages from discontinuous pages using vmemmap_populate_basepages().
--- arch/arm64/mm/mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/arm64/mm/mmu.c +9 -2
@@ -1121,8 +1121,15 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,void *p =NULL ; p =vmemmap_alloc_block_buf (PMD_SIZE , node, altmap); -if (!p) -return -ENOMEM ; +if (!p) { +/* +* fallback allocating with virtually +* contiguous memory for this section +*/ +if (vmemmap_populate_basepages (addr, next, node,NULL )) +return -ENOMEM ; +continue ; + }pmd_set_huge (pmdp,__pa (p),__pgprot (PROT_SECT_NORMAL )); }else
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH v3] arm64/mm: add fallback option to allocate virtually contiguous memory
Quoted 26 lines · Sudarshan Rajagopalan
When section mappings are enabled, we allocate vmemmap pages from physically continuous memory of size
PMD_SIZEusingvmemmap_alloc_block_buf(). Section mappings are good to reduce TLB pressure. But when system is highly fragmented and memory blocks are being hot-added at runtime, its possible that such physically continuous memory allocations can fail. Rather than failing the memory hot-add procedure, add a fallback option to allocate vmemmap pages from discontinuous pages usingvmemmap_populate_basepages().Signed-off-by Sudarshan Rajagopalan <[email protected]>Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Anshuman Khandual <[email protected]>Cc Mark Rutland <[email protected]>Cc Logan Gunthorpe <[email protected]>Cc David Hildenbrand <[email protected]>Cc Andrew Morton <[email protected]>Cc Steven Price <[email protected]>--- arch/arm64/mm/mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)arch/arm64/mm/mmu.c +0
-0
arch/arm64/mm/mmu.c int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, · line 1128
Quoted 10 lines
arch/arm64/mm/mmu.c +5
-2@@ -1121,8 +1121,15 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,void *p =NULL ; p =vmemmap_alloc_block_buf (PMD_SIZE , node, altmap); -if (!p) -return -ENOMEM ; +if (!p) { +/* +* fallback allocating with virtually +* contiguous memory for this section +*/
Mapping is always virtually contiguous with or without huge pages. Please drop this comment here, as it's obvious.
arch/arm64/mm/mmu.c int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, · line 1130
Quoted 2 lines
arch/arm64/mm/mmu.c +2
-0+if (vmemmap_populate_basepages (addr, next, node,NULL )) +return -ENOMEM ;
Please send in the 'altmap' instead of NULL for allocation from device memory if and when requested.
Gavin Shan
Reviewed-byRe: [PATCH v3] arm64/mm: add fallback option to allocate virtually contiguous memory
Quoted 9 lines · Anshuman Khandual
Quoted 8 lines · Sudarshan Rajagopalan
When section mappings are enabled, we allocate vmemmap pages from physically continuous memory of size
PMD_SIZEusingvmemmap_alloc_block_buf(). Section mappings are good to reduce TLB pressure. But when system is highly fragmented and memory blocks are being hot-added at runtime, its possible that such physically continuous memory allocations can fail. Rather than failing the memory hot-add procedure, add a fallback option to allocate vmemmap pages from discontinuous pages usingvmemmap_populate_basepages().
Quoted 13 lines
Quoted 9 lines
Signed-off-by Sudarshan Rajagopalan <[email protected]>Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Anshuman Khandual <[email protected]>Cc Mark Rutland <[email protected]>Cc Logan Gunthorpe <[email protected]>Cc David Hildenbrand <[email protected]>Cc Andrew Morton <[email protected]>Cc Steven Price <[email protected]>Quoted 4 lines
--- arch/arm64/mm/mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
It looks good to me with Anshuman's comments fixed:
Quoted 30 lines
Quoted 5 lines
arch/arm64/mm/mmu.c +0
-0arch/arm64/mm/mmu.c int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, · line 1128
Quoted 10 lines
arch/arm64/mm/mmu.c +5
-2@@ -1121,8 +1121,15 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,void *p =NULL ; p =vmemmap_alloc_block_buf (PMD_SIZE , node, altmap); -if (!p) -return -ENOMEM ; +if (!p) { +/* +* fallback allocating with virtually +* contiguous memory for this section +*/ Mapping is always virtually contiguous with or without huge pages. Please drop this comment here, as it's obvious.
arch/arm64/mm/mmu.c int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, · line 1130
Quoted 2 lines
arch/arm64/mm/mmu.c +2
-0+if (vmemmap_populate_basepages (addr, next, node,NULL )) +return -ENOMEM ;Please send in the 'altmap' instead of NULL for allocation from device memory if and when requested.
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel