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 7d46c84414188bf401777e4d65a9652e5cc09fa5..63b83ceebd1a0984403af50aaefe29331d5f3132 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 9ad39690a2bdf20311230463576ff90c47d3a25e..ae8b06c828c7fdeac2548ea4d85ecf94b52f257c 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;