memblock: Allow memblock_init to be called early
authorJeremy Fitzhardinge <jeremy@goop.org>
Wed, 6 Oct 2010 22:52:29 +0000 (15:52 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Mon, 11 Oct 2010 22:59:01 +0000 (15:59 -0700)
The Xen setup code needs to call memblock_x86_reserve_range() very early,
so allow it to initialize the memblock subsystem before doing so.  The
second memblock_init() is ignored.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
LKML-Reference: <4CACFDAD.3090900@goop.org>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/xen/enlighten.c
mm/memblock.c

index 7d46c84..63b83ce 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/console.h>
 #include <linux/pci.h>
 #include <linux/gfp.h>
+#include <linux/memblock.h>
 
 #include <xen/xen.h>
 #include <xen/interface/xen.h>
@@ -1183,6 +1184,8 @@ asmlinkage void __init xen_start_kernel(void)
        local_irq_disable();
        early_boot_irqs_off();
 
+       memblock_init();
+
        xen_raw_console_write("mapping kernel into physical memory\n");
        pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
 
index 9ad3969..ae8b06c 100644 (file)
@@ -752,6 +752,12 @@ void __init memblock_analyze(void)
 
 void __init memblock_init(void)
 {
+       static int init_done __initdata = 0;
+
+       if (init_done)
+               return;
+       init_done = 1;
+
        /* Hookup the initial arrays */
        memblock.memory.regions = memblock_memory_init_regions;
        memblock.memory.max             = INIT_MEMBLOCK_REGIONS;