arm64/mm: add fallback option to allocate virtually contiguous memory
PATCH v3 1/1 arm64/mm: add fallback option to allocate virtually contiguous memory
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 continous to allocate physically contiguous memory for other sections.
https://lkml.org/lkml/2020/9/30/1489
V3: Addressed trivial review comments. Pass in altmap to vmemmap_populate_basepages.
Sudarshan Rajagopalan (1):
arm64/mm: add fallback option to allocate virtually contiguous memory
arch/arm64/mm/mmu.c | 7 +++++-- 1 file changed, 5 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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/arm64/mm/mmu.c +5 -2
@@ -1121,8 +1121,11 @@ 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) { +if (vmemmap_populate_basepages (addr, next, node, altmap)) +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
Quoted 7 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().
There is a checkpatch warning here, which could be fixed while merging ?
WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line) #7:
When section mappings are enabled, we allocate vmemmap pages from physically
total: 0 errors, 1 warnings, 13 lines checked
Quoted 11 lines
Signed-off-by Sudarshan Rajagopalan <[email protected]>Reviewed-by Gavin Shan <[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]>
Nonetheless, this looks fine. Did not see any particular problem while creating an experimental vmemmap with interleaving section and base page mapping.
Quoted 23 lines
--- arch/arm64/mm/mmu.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)arch/arm64/mm/mmu.c +5
-2@@ -1121,8 +1121,11 @@ 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) { +if (vmemmap_populate_basepages (addr, next, node, altmap)) +return -ENOMEM ; +continue ; + }pmd_set_huge (pmdp,__pa (p),__pgprot (PROT_SECT_NORMAL )); }else
Quoted 9 lines · Anshuman Khandual
Quoted 7 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 9 lines
There is a checkpatch warning here, which could be fixed while merging ?
WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#7:
When section mappings are enabled, we allocate vmemmap pages from physicallytotal: 0 errors, 1 warnings, 13 lines checked
Thanks Anshuman for the review. I sent out an updated patch fixing the checkpatch warning.
Quoted 39 lines
Quoted 11 lines
Signed-off-by Sudarshan Rajagopalan <[email protected]>Reviewed-by Gavin Shan <[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]>Nonetheless, this looks fine. Did not see any particular problem while creating an experimental vmemmap with interleaving section and base page mapping.
Reviewed-by Anshuman Khandual <[email protected]>Quoted 21 lines
--- arch/arm64/mm/mmu.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)arch/arm64/mm/mmu.c +5
-2@@ -1121,8 +1121,11 @@ 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) { +if (vmemmap_populate_basepages (addr, next, node, altmap)) +return -ENOMEM ; +continue ; + }
Quoted 3 lines
Quoted 3 lines
arch/arm64/mm/mmu.c +0
-0pmd_set_huge (pmdp,__pa (p),__pgprot (PROT_SECT_NORMAL ));} else
Sudarshan
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project