ARM: mm: use physical addresses in highmem sanity checks
authorCyril Chemparathy <cyril@ti.com>
Fri, 20 Jul 2012 16:01:23 +0000 (12:01 -0400)
committerWill Deacon <will.deacon@arm.com>
Thu, 30 May 2013 15:02:18 +0000 (16:02 +0100)
This patch modifies the highmem sanity checking code to use physical addresses
instead.  This change eliminates the wrap-around problems associated with the
original virtual address based checks, and this simplifies the code a bit.

The one constraint imposed here is that low physical memory must be mapped in
a monotonically increasing fashion if there are multiple banks of memory,
i.e., x < y must => pa(x) < pa(y).

Signed-off-by: Cyril Chemparathy <cyril@ti.com>
Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Subash Patel <subash.rp@samsung.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm/mm/mmu.c

index b7ce65a82371ca521051f18de99fc60ba584c014..fc6ff1a9db50211a579b2151c6eb27b9733a22d2 100644 (file)
@@ -988,6 +988,7 @@ phys_addr_t arm_lowmem_limit __initdata = 0;
 void __init sanity_check_meminfo(void)
 {
        int i, j, highmem = 0;
+       phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
 
        for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
                struct membank *bank = &meminfo.bank[j];
@@ -997,8 +998,7 @@ void __init sanity_check_meminfo(void)
                        highmem = 1;
 
 #ifdef CONFIG_HIGHMEM
-               if (__va(bank->start) >= vmalloc_min ||
-                   __va(bank->start) < (void *)PAGE_OFFSET)
+               if (bank->start >= vmalloc_limit)
                        highmem = 1;
 
                bank->highmem = highmem;
@@ -1007,8 +1007,8 @@ void __init sanity_check_meminfo(void)
                 * Split those memory banks which are partially overlapping
                 * the vmalloc area greatly simplifying things later.
                 */
-               if (!highmem && __va(bank->start) < vmalloc_min &&
-                   bank->size > vmalloc_min - __va(bank->start)) {
+               if (!highmem && bank->start < vmalloc_limit &&
+                   bank->size > vmalloc_limit - bank->start) {
                        if (meminfo.nr_banks >= NR_BANKS) {
                                printk(KERN_CRIT "NR_BANKS too low, "
                                                 "ignoring high memory\n");
@@ -1017,12 +1017,12 @@ void __init sanity_check_meminfo(void)
                                        (meminfo.nr_banks - i) * sizeof(*bank));
                                meminfo.nr_banks++;
                                i++;
-                               bank[1].size -= vmalloc_min - __va(bank->start);
-                               bank[1].start = __pa(vmalloc_min - 1) + 1;
+                               bank[1].size -= vmalloc_limit - bank->start;
+                               bank[1].start = vmalloc_limit;
                                bank[1].highmem = highmem = 1;
                                j++;
                        }
-                       bank->size = vmalloc_min - __va(bank->start);
+                       bank->size = vmalloc_limit - bank->start;
                }
 #else
                bank->highmem = highmem;
@@ -1042,8 +1042,7 @@ void __init sanity_check_meminfo(void)
                 * Check whether this memory bank would entirely overlap
                 * the vmalloc area.
                 */
-               if (__va(bank->start) >= vmalloc_min ||
-                   __va(bank->start) < (void *)PAGE_OFFSET) {
+               if (bank->start >= vmalloc_limit) {
                        printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
                               "(vmalloc region overlap).\n",
                               (unsigned long long)bank->start,
@@ -1055,9 +1054,8 @@ void __init sanity_check_meminfo(void)
                 * Check whether this memory bank would partially overlap
                 * the vmalloc area.
                 */
-               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);
+               if (bank->start + bank->size > vmalloc_limit)
+                       unsigned long newsize = vmalloc_limit - bank->start;
                        printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
                               "to -%.8llx (vmalloc region overlap).\n",
                               (unsigned long long)bank->start,