• Wei Yang's avatar
    mm/page_alloc.c: fix calculation of pgdat->nr_zones · 8f416836
    Wei Yang authored
    init_currently_empty_zone() will adjust pgdat->nr_zones and set it to
    'zone_idx(zone) + 1' unconditionally.  This is correct in the normal
    case, while not exact in hot-plug situation.
    This function is used in two places:
      * free_area_init_core()
      * move_pfn_range_to_zone()
    In the first case, we are sure zone index increase monotonically.  While
    in the second one, this is under users control.
    One way to reproduce this is:
    1. create a virtual machine with empty node1
       -m 4G,slots=32,maxmem=32G \
       -smp 4,maxcpus=8          \
       -numa node,nodeid=0,mem=4G,cpus=0-3 \
       -numa node,nodeid=1,mem=0G,cpus=4-7
    2. hot-add cpu 3-7
       cpu-add [3-7]
    2. hot-add memory to nod1
       object_add memory-backend-ram,id=ram0,size=1G
       device_add pc-dimm,id=dimm0,memdev=ram0,node=1
    3. online memory with following order
       echo online_movable > memory47/state
       echo online > memory40/state
    After this, node1 will have its nr_zones equals to (ZONE_NORMAL + 1)
    instead of (ZONE_MOVABLE + 1).
    Michal said:
     "Having an incorrect nr_zones might result in all sorts of problems
      which would be quite hard to debug (e.g. reclaim not considering the
      movable zone). I do not expect many users would suffer from this it
      but still this is trivial and obviously right thing to do so
      backporting to the stable tree shouldn't be harmful (last famous
    Link: http://lkml.kernel.org/r/20181117022022.9956-1-richard.weiyang@gmail.com
    Fixes: f1dd2cd1 ("mm, memory_hotplug: do not associate hotadded memory to zones until online")
    Signed-off-by: default avatarWei Yang <richard.weiyang@gmail.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
page_alloc.c 225 KB