• Mark Rutland's avatar
    ARM: 8356/1: mm: handle non-pmd-aligned end of RAM · 965278dc
    Mark Rutland authored
    At boot time we round the memblock limit down to section size in an
    attempt to ensure that we will have mapped this RAM with section
    mappings prior to allocating from it. When mapping RAM we iterate over
    PMD-sized chunks, creating these section mappings.
    
    Section mappings are only created when the end of a chunk is aligned to
    section size. Unfortunately, with classic page tables (where PMD_SIZE is
    2 * SECTION_SIZE) this means that if a chunk is between 1M and 2M in
    size the first 1M will not be mapped despite having been accounted for
    in the memblock limit. This has been observed to result in page tables
    being allocated from unmapped memory, causing boot-time hangs.
    
    This patch modifies the memblock limit rounding to always round down to
    PMD_SIZE instead of SECTION_SIZE. For classic MMU this means that we
    will round the memblock limit down to a 2M boundary, matching the limits
    on section mappings, and preventing allocations from unmapped memory.
    For LPAE there should be no change as PMD_SIZE == SECTION_SIZE.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reported-by: default avatarStefan Agner <stefan@agner.ch>
    Tested-by: default avatarStefan Agner <stefan@agner.ch>
    Acked-by: default avatarLaura Abbott <labbott@redhat.com>
    Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Steve Capper <steve.capper@linaro.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    965278dc
mmu.c 41.4 KB