slab,slub: don't enable interrupts during early boot
[sfrench/cifs-2.6.git] / init / main.c
index 3bbf93be744cf8be8614ca92c32b01181bf58a4f..f6204f712e7c639652d06cbefb70bba4df2ae7a1 100644 (file)
@@ -56,6 +56,7 @@
 #include <linux/debug_locks.h>
 #include <linux/debugobjects.h>
 #include <linux/lockdep.h>
+#include <linux/kmemleak.h>
 #include <linux/pid_namespace.h>
 #include <linux/device.h>
 #include <linux/kthread.h>
@@ -64,6 +65,7 @@
 #include <linux/idr.h>
 #include <linux/ftrace.h>
 #include <linux/async.h>
+#include <linux/kmemtrace.h>
 #include <trace/boot.h>
 
 #include <asm/io.h>
@@ -71,7 +73,6 @@
 #include <asm/setup.h>
 #include <asm/sections.h>
 #include <asm/cacheflush.h>
-#include <trace/kmemtrace.h>
 
 #ifdef CONFIG_X86_LOCAL_APIC
 #include <asm/smp.h>
@@ -533,6 +534,21 @@ void __init __weak thread_info_cache_init(void)
 {
 }
 
+/*
+ * Set up kernel memory allocators
+ */
+static void __init mm_init(void)
+{
+       /*
+        * page_cgroup requires countinous pages as memmap
+        * and it's bigger than MAX_ORDER unless SPARSEMEM.
+        */
+       page_cgroup_init_flatmem();
+       mem_init();
+       kmem_cache_init();
+       vmalloc_init();
+}
+
 asmlinkage void __init start_kernel(void)
 {
        char * command_line;
@@ -566,8 +582,7 @@ asmlinkage void __init start_kernel(void)
        tick_init();
        boot_cpu_init();
        page_address_init();
-       printk(KERN_NOTICE);
-       printk(linux_banner);
+       printk(KERN_NOTICE "%s", linux_banner);
        setup_arch(&command_line);
        mm_init_owner(&init_mm, &init_task);
        setup_command_line(command_line);
@@ -575,6 +590,23 @@ asmlinkage void __init start_kernel(void)
        setup_nr_cpu_ids();
        smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
 
+       build_all_zonelists();
+       page_alloc_init();
+
+       printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
+       parse_early_param();
+       parse_args("Booting kernel", static_command_line, __start___param,
+                  __stop___param - __start___param,
+                  &unknown_bootoption);
+       /*
+        * These use large bootmem allocations and must precede
+        * kmem_cache_init()
+        */
+       pidhash_init();
+       vfs_caches_init_early();
+       sort_main_extable();
+       trap_init();
+       mm_init();
        /*
         * Set up the scheduler prior starting any interrupts (such as the
         * timer interrupt). Full topology setup happens at smp_init()
@@ -586,25 +618,16 @@ asmlinkage void __init start_kernel(void)
         * fragile until we cpu_idle() for the first time.
         */
        preempt_disable();
-       build_all_zonelists();
-       page_alloc_init();
-       printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
-       parse_early_param();
-       parse_args("Booting kernel", static_command_line, __start___param,
-                  __stop___param - __start___param,
-                  &unknown_bootoption);
        if (!irqs_disabled()) {
                printk(KERN_WARNING "start_kernel(): bug: interrupts were "
                                "enabled *very* early, fixing it\n");
                local_irq_disable();
        }
-       sort_main_extable();
-       trap_init();
        rcu_init();
        /* init some links before init_ISA_irqs() */
        early_irq_init();
        init_IRQ();
-       pidhash_init();
+       prio_tree_init();
        init_timers();
        hrtimers_init();
        softirq_init();
@@ -617,6 +640,7 @@ asmlinkage void __init start_kernel(void)
                                 "enabled early\n");
        early_boot_irqs_on();
        local_irq_enable();
+       kmem_cache_init_late();
 
        /*
         * HACK ALERT! This is early. We're enabling the console before
@@ -646,15 +670,12 @@ asmlinkage void __init start_kernel(void)
                initrd_start = 0;
        }
 #endif
-       vmalloc_init();
-       vfs_caches_init_early();
        cpuset_init_early();
        page_cgroup_init();
-       mem_init();
        enable_debug_pagealloc();
        cpu_hotplug_init();
-       kmem_cache_init();
        kmemtrace_init();
+       kmemleak_init();
        debug_objects_mem_init();
        idr_init_cache();
        setup_per_cpu_pageset();
@@ -664,7 +685,6 @@ asmlinkage void __init start_kernel(void)
        calibrate_delay();
        pidmap_init();
        pgtable_cache_init();
-       prio_tree_init();
        anon_vma_init();
 #ifdef CONFIG_X86
        if (efi_enabled)