• Oliver O'Halloran's avatar
    mm/init: fix zone boundary creation · 09f7ddc4
    Oliver O'Halloran authored
    commit 90cae1fe upstream.
    
    As a part of memory initialisation the architecture passes an array to
    free_area_init_nodes() which specifies the max PFN of each memory zone.
    This array is not necessarily monotonic (due to unused zones) so this
    array is parsed to build monotonic lists of the min and max PFN for each
    zone.  ZONE_MOVABLE is special cased here as its limits are managed by
    the mm subsystem rather than the architecture.  Unfortunately, this
    special casing is broken when ZONE_MOVABLE is the not the last zone in
    the zone list.  The core of the issue is:
    
    	if (i == ZONE_MOVABLE)
    		continue;
    	arch_zone_lowest_possible_pfn[i] =
    		arch_zone_highest_possible_pfn[i-1];
    
    As ZONE_MOVABLE is skipped the lowest_possible_pfn of the next zone will
    be set to zero.  This patch fixes this bug by adding explicitly tracking
    where the next zone should start rather than relying on the contents
    arch_zone_highest_possible_pfn[].
    
    Thie is low priority.  To get bitten by this you need to enable a zone
    that appears after ZONE_MOVABLE in the zone_type enum.  As far as I can
    tell this means running a kernel with ZONE_DEVICE or ZONE_CMA enabled,
    so I can't see this affecting too many people.
    
    I only noticed this because I've been fiddling with ZONE_DEVICE on
    powerpc and 4.6 broke my test kernel.  This bug, in conjunction with the
    changes in Taku Izumi's kernelcore=mirror patch (d91749c1) and
    powerpc being the odd architecture which initialises max_zone_pfn[] to
    ~0ul instead of 0 caused all of system memory to be placed into
    ZONE_DEVICE at boot, followed a panic since device memory cannot be used
    for kernel allocations.  I've already submitted a patch to fix the
    powerpc specific bits, but I figured this should be fixed too.
    
    Link: http://lkml.kernel.org/r/1462435033-15601-1-git-send-email-oohall@gmail.comSigned-off-by: default avatarOliver O'Halloran <oohall@gmail.com>
    Cc: Anton Blanchard <anton@samba.org>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    09f7ddc4
page_alloc.c 182 KB