Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[pandora-kernel.git] / init / main.c
index 833a67d..f7fb200 100644 (file)
 #include <linux/unwind.h>
 #include <linux/buffer_head.h>
 #include <linux/debug_locks.h>
+#include <linux/debugobjects.h>
 #include <linux/lockdep.h>
 #include <linux/pid_namespace.h>
 #include <linux/device.h>
 #include <linux/kthread.h>
 #include <linux/sched.h>
 #include <linux/signal.h>
+#include <linux/idr.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -458,7 +460,7 @@ static void noinline __init_refok rest_init(void)
        kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
        numa_default_policy();
        pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
-       kthreadd_task = find_task_by_pid(pid);
+       kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
        unlock_kernel();
 
        /*
@@ -521,7 +523,11 @@ static void __init boot_cpu_init(void)
        cpu_set(cpu, cpu_possible_map);
 }
 
-void __init __attribute__((weak)) smp_setup_processor_id(void)
+void __init __weak smp_setup_processor_id(void)
+{
+}
+
+void __init __weak thread_info_cache_init(void)
 {
 }
 
@@ -538,6 +544,7 @@ asmlinkage void __init start_kernel(void)
         */
        unwind_init();
        lockdep_init();
+       debug_objects_early_init();
        cgroup_init_early();
 
        local_irq_disable();
@@ -555,6 +562,7 @@ asmlinkage void __init start_kernel(void)
        printk(KERN_NOTICE);
        printk(linux_banner);
        setup_arch(&command_line);
+       mm_init_owner(&init_mm, &init_task);
        setup_command_line(command_line);
        unwind_setup();
        setup_per_cpu_areas();
@@ -594,6 +602,7 @@ asmlinkage void __init start_kernel(void)
        softirq_init();
        timekeeping_init();
        time_init();
+       sched_clock_init();
        profile_init();
        if (!irqs_disabled())
                printk("start_kernel(): bug: interrupts were enabled early\n");
@@ -632,6 +641,8 @@ asmlinkage void __init start_kernel(void)
        enable_debug_pagealloc();
        cpu_hotplug_init();
        kmem_cache_init();
+       debug_objects_mem_init();
+       idr_init_cache();
        setup_per_cpu_pageset();
        numa_policy_init();
        if (late_time_init)
@@ -645,6 +656,7 @@ asmlinkage void __init start_kernel(void)
        if (efi_enabled)
                efi_enter_virtual_mode();
 #endif
+       thread_info_cache_init();
        fork_init(num_physpages);
        proc_caches_init();
        buffer_init();
@@ -681,63 +693,57 @@ static int __init initcall_debug_setup(char *str)
 }
 __setup("initcall_debug", initcall_debug_setup);
 
-extern initcall_t __initcall_start[], __initcall_end[];
-
-static void __init do_initcalls(void)
+static void __init do_one_initcall(initcall_t fn)
 {
-       initcall_t *call;
        int count = preempt_count();
+       ktime_t t0, t1, delta;
+       char msgbuf[64];
+       int result;
 
-       for (call = __initcall_start; call < __initcall_end; call++) {
-               ktime_t t0, t1, delta;
-               char *msg = NULL;
-               char msgbuf[40];
-               int result;
-
-               if (initcall_debug) {
-                       printk("Calling initcall 0x%p", *call);
-                       print_fn_descriptor_symbol(": %s()",
-                                       (unsigned long) *call);
-                       printk("\n");
-                       t0 = ktime_get();
-               }
+       if (initcall_debug) {
+               print_fn_descriptor_symbol("calling  %s\n", fn);
+               t0 = ktime_get();
+       }
 
-               result = (*call)();
+       result = fn();
 
-               if (initcall_debug) {
-                       t1 = ktime_get();
-                       delta = ktime_sub(t1, t0);
+       if (initcall_debug) {
+               t1 = ktime_get();
+               delta = ktime_sub(t1, t0);
 
-                       printk("initcall 0x%p", *call);
-                       print_fn_descriptor_symbol(": %s()",
-                                       (unsigned long) *call);
-                       printk(" returned %d.\n", result);
+               print_fn_descriptor_symbol("initcall %s", fn);
+               printk(" returned %d after %Ld msecs\n", result,
+                       (unsigned long long) delta.tv64 >> 20);
+       }
 
-                       printk("initcall 0x%p ran for %Ld msecs: ",
-                               *call, (unsigned long long)delta.tv64 >> 20);
-                       print_fn_descriptor_symbol("%s()\n",
-                               (unsigned long) *call);
-               }
+       msgbuf[0] = 0;
 
-               if (result && result != -ENODEV && initcall_debug) {
-                       sprintf(msgbuf, "error code %d", result);
-                       msg = msgbuf;
-               }
-               if (preempt_count() != count) {
-                       msg = "preemption imbalance";
-                       preempt_count() = count;
-               }
-               if (irqs_disabled()) {
-                       msg = "disabled interrupts";
-                       local_irq_enable();
-               }
-               if (msg) {
-                       printk(KERN_WARNING "initcall at 0x%p", *call);
-                       print_fn_descriptor_symbol(": %s()",
-                                       (unsigned long) *call);
-                       printk(": returned with %s\n", msg);
-               }
+       if (result && result != -ENODEV && initcall_debug)
+               sprintf(msgbuf, "error code %d ", result);
+
+       if (preempt_count() != count) {
+               strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
+               preempt_count() = count;
+       }
+       if (irqs_disabled()) {
+               strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
+               local_irq_enable();
+       }
+       if (msgbuf[0]) {
+               print_fn_descriptor_symbol(KERN_WARNING "initcall %s", fn);
+               printk(" returned with %s\n", msgbuf);
        }
+}
+
+
+extern initcall_t __initcall_start[], __initcall_end[];
+
+static void __init do_initcalls(void)
+{
+       initcall_t *call;
+
+       for (call = __initcall_start; call < __initcall_end; call++)
+               do_one_initcall(*call);
 
        /* Make sure there is no pending stuff from the initcall sequence */
        flush_scheduled_work();
@@ -802,6 +808,8 @@ static int noinline init_post(void)
        (void) sys_dup(0);
        (void) sys_dup(0);
 
+       current->signal->flags |= SIGNAL_UNKILLABLE;
+
        if (ramdisk_execute_command) {
                run_init_process(ramdisk_execute_command);
                printk(KERN_WARNING "Failed to execute %s\n",