On Thu 27-01-22 01:20:23, Wei Yang wrote: > During memory hotplug, when online/offline a zone, we need to rebuild > the zonelist for all node. There are two checks to decide whether a zone > would be added to zonelist: > > * one in online_pages/offline_pages to decide necessity > * one in build_zonerefs_node to do real add > > Currently we use different criteria at these two places, which is > different from the original behavior. > > Originally during memory hotplug, zonelist is re-built when zone hasn't > been populated. This in introduced in 'commit 6811378e7d8b ("[PATCH] > wait_table and zonelist initializing for memory hotadd: update zonelists")'. > And at that moment, build_zonelists_node() also use populated_zone() to > decide whether the zone should be added to zonelist. > > While in 'commit 6aa303defb74 ("mm, vmscan: only allocate and reclaim > from zones with pages managed by the buddy allocator")', > build_zonelists_node() changed to use managed_zone() to add zonelist. > But we still use populated_zone() to decide the necessity. > > This patch restore the original behavior by using the same criteria to > add a zone in zonelist during memory hotplug. Why? > Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxx> > Fixes: 6aa303defb74 ("mm, vmscan: only allocate and reclaim from zones with pages managed by the buddy allocator") > CC: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> > --- > mm/memory_hotplug.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index 2a9627dc784c..8f1906b33937 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -1102,11 +1102,11 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, > spin_unlock_irqrestore(&zone->lock, flags); > > /* > - * If this zone is not populated, then it is not in zonelist. > + * If this zone is not managed, then it is not in zonelist. > * This means the page allocator ignores this zone. > * So, zonelist must be updated after online. > */ > - if (!populated_zone(zone)) { > + if (!managed_zone(zone)) { > need_zonelists_rebuild = 1; > setup_zone_pageset(zone); > } > @@ -1985,7 +1985,7 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages, > /* reinitialise watermarks and update pcp limits */ > init_per_zone_wmark_min(); > > - if (!populated_zone(zone)) { > + if (!managed_zone(zone)) { > zone_pcp_reset(zone); > build_all_zonelists(NULL); > } > -- > 2.33.1 -- Michal Hocko SUSE Labs