powerpc: Only use initrd_end as the limit for alloc_bottom if it's inside the RMO.
authorPaul Mackerras <paulus@samba.org>
Tue, 13 Dec 2011 17:54:13 +0000 (17:54 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 19 Dec 2011 03:41:24 +0000 (14:41 +1100)
As the kernels and initrd's get bigger boot-loaders and possibly
kexec-tools will need to place the initrd outside the RMO.  When this
happens we end up with no lowmem and the boot doesn't get very far.

Only use initrd_end as the limit for alloc_bottom if it's inside the
RMO.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Tony Breeds <tony@bakeyournoodle.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/prom_init.c

index df47316f1aee921d8ba2c2805b92af19c574d788..32b5b05082eac2d956e8e944d3a21c0cdd2b114f 100644 (file)
@@ -1224,14 +1224,6 @@ static void __init prom_init_mem(void)
 
        RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000);
 
-       /* Check if we have an initrd after the kernel, if we do move our bottom
-        * point to after it
-        */
-       if (RELOC(prom_initrd_start)) {
-               if (RELOC(prom_initrd_end) > RELOC(alloc_bottom))
-                       RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
-       }
-
        /*
         * If prom_memory_limit is set we reduce the upper limits *except* for
         * alloc_top_high. This must be the real top of RAM so we can put
@@ -1269,6 +1261,15 @@ static void __init prom_init_mem(void)
        RELOC(alloc_top) = RELOC(rmo_top);
        RELOC(alloc_top_high) = RELOC(ram_top);
 
+       /*
+        * Check if we have an initrd after the kernel but still inside
+        * the RMO.  If we do move our bottom point to after it.
+        */
+       if (RELOC(prom_initrd_start) &&
+           RELOC(prom_initrd_start) < RELOC(rmo_top) &&
+           RELOC(prom_initrd_end) > RELOC(alloc_bottom))
+               RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end));
+
        prom_printf("memory layout at init:\n");
        prom_printf("  memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit));
        prom_printf("  alloc_bottom : %x\n", RELOC(alloc_bottom));