]> Pileus Git - ~andy/linux/blobdiff - arch/arm/mm/mmu.c
ARM: mm: clean up membank size limit checks
[~andy/linux] / arch / arm / mm / mmu.c
index e0d8565671a6c8104c643937098b963ac2f517ee..280f91d02de252179cbfea0a8741a39f26505fb9 100644 (file)
@@ -673,7 +673,8 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
 }
 
 static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
-       unsigned long end, unsigned long phys, const struct mem_type *type)
+                                 unsigned long end, phys_addr_t phys,
+                                 const struct mem_type *type)
 {
        pud_t *pud = pud_offset(pgd, addr);
        unsigned long next;
@@ -987,27 +988,28 @@ 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];
-               *bank = meminfo.bank[i];
+               phys_addr_t size_limit;
 
-               if (bank->start > ULONG_MAX)
-                       highmem = 1;
+               *bank = meminfo.bank[i];
+               size_limit = bank->size;
 
-#ifdef CONFIG_HIGHMEM
-               if (__va(bank->start) >= vmalloc_min ||
-                   __va(bank->start) < (void *)PAGE_OFFSET)
+               if (bank->start >= vmalloc_limit)
                        highmem = 1;
+               else
+                       size_limit = vmalloc_limit - bank->start;
 
                bank->highmem = highmem;
 
+#ifdef CONFIG_HIGHMEM
                /*
                 * 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->size > size_limit) {
                        if (meminfo.nr_banks >= NR_BANKS) {
                                printk(KERN_CRIT "NR_BANKS too low, "
                                                 "ignoring high memory\n");
@@ -1016,16 +1018,14 @@ 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 -= size_limit;
+                               bank[1].start = vmalloc_limit;
                                bank[1].highmem = highmem = 1;
                                j++;
                        }
-                       bank->size = vmalloc_min - __va(bank->start);
+                       bank->size = size_limit;
                }
 #else
-               bank->highmem = highmem;
-
                /*
                 * Highmem banks not allowed with !CONFIG_HIGHMEM.
                 */
@@ -1037,32 +1037,17 @@ void __init sanity_check_meminfo(void)
                        continue;
                }
 
-               /*
-                * Check whether this memory bank would entirely overlap
-                * the vmalloc area.
-                */
-               if (__va(bank->start) >= vmalloc_min ||
-                   __va(bank->start) < (void *)PAGE_OFFSET) {
-                       printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
-                              "(vmalloc region overlap).\n",
-                              (unsigned long long)bank->start,
-                              (unsigned long long)bank->start + bank->size - 1);
-                       continue;
-               }
-
                /*
                 * 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->size > size_limit) {
                        printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
                               "to -%.8llx (vmalloc region overlap).\n",
                               (unsigned long long)bank->start,
                               (unsigned long long)bank->start + bank->size - 1,
-                              (unsigned long long)bank->start + newsize - 1);
-                       bank->size = newsize;
+                              (unsigned long long)bank->start + size_limit - 1);
+                       bank->size = size_limit;
                }
 #endif
                if (!bank->highmem && bank->start + bank->size > arm_lowmem_limit)