On 10/02/2020 01:46 AM, Sudarshan Rajagopalan wrote: > 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(). > > Signed-off-by: Sudarshan Rajagopalan <sudar...@codeaurora.org> > Cc: Catalin Marinas <catalin.mari...@arm.com> > Cc: Will Deacon <w...@kernel.org> > Cc: Anshuman Khandual <anshuman.khand...@arm.com> > Cc: Mark Rutland <mark.rutl...@arm.com> > Cc: Logan Gunthorpe <log...@deltatee.com> > Cc: David Hildenbrand <da...@redhat.com> > Cc: Andrew Morton <a...@linux-foundation.org> > Cc: Steven Price <steven.pr...@arm.com> > --- > arch/arm64/mm/mmu.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c > index 75df62f..11f8639 100644 > --- a/arch/arm64/mm/mmu.c > +++ b/arch/arm64/mm/mmu.c > @@ -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. > + 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.