• Will Deacon's avatar
    ARM: 6914/1: sparsemem: fix highmem detection when using SPARSEMEM · 40f7bfe4
    Will Deacon authored
    sanity_check_meminfo walks over the registered memory banks and attempts
    to split banks across lowmem and highmem when they would otherwise
    overlap with the vmalloc space.
    
    When SPARSEMEM is used, there are two potential problems that occur
    when the virtual address of the start of a bank is equal to vmalloc_min.
    
     1.) The end of lowmem is calculated as __pa(vmalloc_min - 1) + 1.
         In the above scenario, this will give the end address of the
         previous bank, rather than the actual bank we are interested in.
         This value is later used as the memblock limit and artificially
         restricts the total amount of available memory.
    
     2.) The checks to determine whether or not a bank belongs to highmem
         or not only check if __va(bank->start) is greater or less than
         vmalloc_min. In the case that it is equal, the bank is incorrectly
         treated as lowmem, which hoses the vmalloc area.
    
    This patch fixes these two problems by checking whether the virtual
    start address of a bank is >= vmalloc_min and then calculating
    lowmem_end by finding the virtual end address of the highest lowmem
    bank.
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reviewed-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    40f7bfe4
mmu.c 28.1 KB