[linux-yocto] [PATCH 13/28] ARM: 7499/1: mm: Fix vmalloc overlap check for !HIGHMEM

Charlie Paul cpaul.windriver at gmail.com
Fri May 2 09:22:17 PDT 2014


From: Anders Berg <anders.berg at lsi.com>

  commit 36418c516b31bff4ff949c7c618430a1a514debe upstream

  With !HIGHMEM, sanity_check_meminfo checks for banks that completely or
  partially overlap the vmalloc region. The test for partial overlap checks
  __va(bank->start + bank->size) > vmalloc_min. This is not appropriate if
  there is a non-linear translation between virtual and physical addresses,
  as bank->start + bank->size is actually in the bank following the one being
  interrogated.

  In most cases, even when using SPARSEMEM, this is not problematic as the
  subsequent bank will start at a higher va than the one in question. However
  if the physical to virtual address conversion is not monotonic increasing,
  the incorrect test could result in a bank not being truncated when it
  should be.

  This patch ensures we perform the va-pa conversion on memory from the
  bank we are interested in, not the following one.

  Reported-by: ??? (Steve) <zhanzhenbo at gmail.com>
  Signed-off-by: Jonathan Austin <jonathan.austin at arm.com>
  Acked-by: Nicolas Pitre <nico at linaro.org>
  Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>arm/mmu:
       Fix detection of vmalloc area overlap
  Signed-off-by: Anders Berg <anders.berg at lsi.com>
---
 arch/arm/mm/mmu.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 0acc475..571102e 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -967,8 +967,8 @@ void __init sanity_check_meminfo(void)
 		 * Check whether this memory bank would partially overlap
 		 * the vmalloc area.
 		 */
-		if (__va(bank->start + bank->size) > vmalloc_min ||
-		    __va(bank->start + bank->size) < __va(bank->start)) {
+		if (__va(bank->start + bank->size - 1) >= vmalloc_min ||
+		    __va(bank->start + bank->size - 1) <= __va(bank->start)) {
 			unsigned long newsize = vmalloc_min - __va(bank->start);
 			printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
 			       "to -%.8llx (vmalloc region overlap).\n",
-- 
1.7.9.5



More information about the linux-yocto mailing list