]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ARM: 8356/1: mm: handle non-pmd-aligned end of RAM
authorMark Rutland <mark.rutland@arm.com>
Wed, 13 May 2015 14:07:54 +0000 (15:07 +0100)
committerSasha Levin <sasha.levin@oracle.com>
Wed, 10 Jun 2015 17:42:31 +0000 (13:42 -0400)
commitf0e61cb8cb9ee2c0496439e09d150d66d2b47982
tree76b9c9e75c835802d6d7eb7ff645e63010800ce2
parenta0ed73fbe2457f1f47b638ee4ce8d4aae05d529a
ARM: 8356/1: mm: handle non-pmd-aligned end of RAM

[ Upstream commit 965278dcb8ab0b1f666cc47937933c4be4aea48d ]

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: Mark Rutland <mark.rutland@arm.com>
Reported-by: Stefan Agner <stefan@agner.ch>
Tested-by: Stefan Agner <stefan@agner.ch>
Acked-by: Laura Abbott <labbott@redhat.com>
Tested-by: Hans 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: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
arch/arm/mm/mmu.c