• Y
    x86: Fix adjust_range_size_mask calling position · 7de3d66b
    Yinghai Lu 提交于
    Commit
    
        8d57470d x86, mm: setup page table in top-down
    
    causes a kernel panic while setting mem=2G.
    
         [mem 0x00000000-0x000fffff] page 4k
         [mem 0x7fe00000-0x7fffffff] page 1G
         [mem 0x7c000000-0x7fdfffff] page 1G
         [mem 0x00100000-0x001fffff] page 4k
         [mem 0x00200000-0x7bffffff] page 2M
    
    for last entry is not what we want, we should have
         [mem 0x00200000-0x3fffffff] page 2M
         [mem 0x40000000-0x7bffffff] page 1G
    
    Actually we merge the continuous ranges with same page size too early.
    in this case, before merging we have
         [mem 0x00200000-0x3fffffff] page 2M
         [mem 0x40000000-0x7bffffff] page 2M
    after merging them, will get
         [mem 0x00200000-0x7bffffff] page 2M
    even we can use 1G page to map
         [mem 0x40000000-0x7bffffff]
    
    that will cause problem, because we already map
         [mem 0x7fe00000-0x7fffffff] page 1G
         [mem 0x7c000000-0x7fdfffff] page 1G
    with 1G page, aka [0x40000000-0x7fffffff] is mapped with 1G page already.
    During phys_pud_init() for [0x40000000-0x7bffffff], it will not
    reuse existing that pud page, and allocate new one then try to use
    2M page to map it instead, as page_size_mask does not include
    PG_LEVEL_1G. At end will have [7c000000-0x7fffffff] not mapped, loop
    in phys_pmd_init stop mapping at 0x7bffffff.
    
    That is right behavoir, it maps exact range with exact page size that
    we ask, and we should explicitly call it to map [7c000000-0x7fffffff]
    before or after mapping 0x40000000-0x7bffffff.
    Anyway we need to make sure ranges' page_size_mask correct and consistent
    after split_mem_range for each range.
    
    Fix that by calling adjust_range_size_mask before merging range
    with same page size.
    
    -v2: update change log.
    -v3: add more explanation why [7c000000-0x7fffffff] is not mapped, and
        it causes panic.
    Bisected-by: N"Xie, ChanglongX" <changlongx.xie@intel.com>
    Bisected-by: NYuanhan Liu <yuanhan.liu@linux.intel.com>
    Reported-and-tested-by: NYuanhan Liu <yuanhan.liu@linux.intel.com>
    Signed-off-by: NYinghai Lu <yinghai@kernel.org>
    Link: http://lkml.kernel.org/r/1370015587-20835-1-git-send-email-yinghai@kernel.org
    Cc: <stable@vger.kernel.org> v3.9
    Signed-off-by: NH. Peter Anvin <hpa@linux.intel.com>
    7de3d66b
init.c 15.6 KB