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 <[email protected]>
> > ---
> >  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.

Reply via email to