On Fri 16-04-21 13:24:06, Oscar Salvador wrote: > From: David Hildenbrand <david@xxxxxxxxxx> > > Let's have a single place (inspired by adjust_managed_page_count()) where > we adjust present pages. > In contrast to adjust_managed_page_count(), only memory onlining/offlining > is allowed to modify the number of present pages. > > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> > Signed-off-by: Oscar Salvador <osalvador@xxxxxxx> > Reviewed-by: Oscar Salvador <osalvador@xxxxxxx> Not sure self review counts ;) Acked-by: Michal Hocko <mhocko@xxxxxxxx> Btw. I strongly suspect the resize lock is quite pointless here. Something for a follow up patch. > --- > mm/memory_hotplug.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index 25e59d5dc13c..d05056b3c173 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -829,6 +829,16 @@ struct zone * zone_for_pfn_range(int online_type, int nid, unsigned start_pfn, > return default_zone_for_pfn(nid, start_pfn, nr_pages); > } > > +static void adjust_present_page_count(struct zone *zone, long nr_pages) > +{ > + unsigned long flags; > + > + zone->present_pages += nr_pages; > + pgdat_resize_lock(zone->zone_pgdat, &flags); > + zone->zone_pgdat->node_present_pages += nr_pages; > + pgdat_resize_unlock(zone->zone_pgdat, &flags); > +} > + > int __ref online_pages(unsigned long pfn, unsigned long nr_pages, > int online_type, int nid) > { > @@ -882,11 +892,7 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, > } > > online_pages_range(pfn, nr_pages); > - zone->present_pages += nr_pages; > - > - pgdat_resize_lock(zone->zone_pgdat, &flags); > - zone->zone_pgdat->node_present_pages += nr_pages; > - pgdat_resize_unlock(zone->zone_pgdat, &flags); > + adjust_present_page_count(zone, nr_pages); > > node_states_set_node(nid, &arg); > if (need_zonelists_rebuild) > @@ -1701,11 +1707,7 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) > > /* removal success */ > adjust_managed_page_count(pfn_to_page(start_pfn), -nr_pages); > - zone->present_pages -= nr_pages; > - > - pgdat_resize_lock(zone->zone_pgdat, &flags); > - zone->zone_pgdat->node_present_pages -= nr_pages; > - pgdat_resize_unlock(zone->zone_pgdat, &flags); > + adjust_present_page_count(zone, -nr_pages); > > init_per_zone_wmark_min(); > > -- > 2.16.3 -- Michal Hocko SUSE Labs