Hello Baoquan, On Fri, May 22, 2020 at 03:25:24PM +0800, Baoquan He wrote: > On 05/22/20 at 03:01pm, Baoquan He wrote: > > > > So let's add these unavailable ranges into memblock and reserve them > > in init_unavailable_range() instead. With this change, they will be added > > into appropriate node and zone in memmap_init(), and initialized in > > reserve_bootmem_region() just like any other memblock reserved regions. > > Seems this is not right. They can't get nid in init_unavailable_range(). > Adding e820 ranges may let them get nid. But the hole range won't be > added to memblock, and still has the issue. > > Nack this one for now, still considering. Why won't we add the e820 reserved ranges to memblock.memory during early boot as I suggested? diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index c5399e80c59c..b0940c618ed9 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -1301,8 +1301,11 @@ void __init e820__memblock_setup(void) if (end != (resource_size_t)end) continue; - if (entry->type == E820_TYPE_SOFT_RESERVED) + if (entry->type == E820_TYPE_SOFT_RESERVED || + entry->type == E820_TYPE_RESERVED) { + memblock_add(entry->addr, entry->size); memblock_reserve(entry->addr, entry->size); + } if (entry->type != E820_TYPE_RAM && entry->type != E820_TYPE_RESERVED_KERN) continue; The setting of node later in numa_init() will assign the proper node for these regions as it does for the usable memory. > > > > Signed-off-by: Baoquan He <bhe@xxxxxxxxxx> > > --- > > mm/page_alloc.c | 17 +++++++++++------ > > 1 file changed, 11 insertions(+), 6 deletions(-) > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index 603187800628..3973b5fdfe3f 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -6925,7 +6925,7 @@ static u64 __init init_unavailable_range(unsigned long spfn, unsigned long epfn) > > static void __init init_unavailable_mem(void) > > { > > phys_addr_t start, end; > > - u64 i, pgcnt; > > + u64 i, pgcnt, size; > > phys_addr_t next = 0; > > > > /* > > @@ -6934,9 +6934,11 @@ static void __init init_unavailable_mem(void) > > pgcnt = 0; > > for_each_mem_range(i, &memblock.memory, NULL, > > NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end, NULL) { > > - if (next < start) > > - pgcnt += init_unavailable_range(PFN_DOWN(next), > > - PFN_UP(start)); > > + if (next < start) { > > + size = PFN_UP(start) - PFN_DOWN(next); > > + memblock_add(PFN_DOWN(next), size); > > + memblock_reserve(PFN_DOWN(next), size); > > + } > > next = end; > > } > > > > @@ -6947,8 +6949,11 @@ static void __init init_unavailable_mem(void) > > * considered initialized. Make sure that memmap has a well defined > > * state. > > */ > > - pgcnt += init_unavailable_range(PFN_DOWN(next), > > - round_up(max_pfn, PAGES_PER_SECTION)); > > + size = round_up(max_pfn, PAGES_PER_SECTION) - PFN_DOWN(next); > > + if (size) { > > + memblock_add(PFN_DOWN(next), size); > > + memblock_reserve(PFN_DOWN(next), size); > > + } > > > > /* > > * Struct pages that do not have backing memory. This could be because > > -- > > 2.17.2 > > > -- Sincerely yours, Mike.