• David Daney's avatar
    MIPS: Handle initmem in systems with kernel not in add_memory_region() mem · 43064c0c
    David Daney authored
    This patch addresses a couple of related problems:
    
    1) The kernel may reside in physical memory outside of the ranges set
       by plat_mem_setup().  If this is the case, init mem cannot be
       reused as it resides outside of the range of pages that the kernel
       memory allocators control.
    
    2) initrd images might be loaded in physical memory outside of the
       ranges set by plat_mem_setup().  The memory likewise cannot be
       reused.  The patch doesn't handle this specific case, but the
       infrastructure is useful for future patches that do.
    
    The crux of the problem is that there are memory regions that need be
    memory_present(), but that cannot be free_bootmem() at the time of
    arch_mem_init().  We create a new type of memory (BOOT_MEM_INIT_RAM)
    for use with add_memory_region().  Then arch_mem_init() adds the init
    mem with this type if the init mem is not already covered by existing
    ranges.
    
    When memory is being freed into the bootmem allocator, we skip the
    BOOT_MEM_INIT_RAM ranges so they are not clobbered, but we do signal
    them as memory_present().  This way when they are later freed, the
    necessary memory manager structures have initialized and the Sparse
    allocater is prevented from crashing.
    
    The Octeon specific code that handled this case is removed, because
    the new general purpose code handles the case.
    Signed-off-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
    To: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/1988/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    43064c0c
setup.c 21 KB