diff options
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/init/main.c b/init/main.c index b44e4eb0f5e3..6aaff34a38c0 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/smp_lock.h> | 24 | #include <linux/smp_lock.h> |
25 | #include <linux/initrd.h> | 25 | #include <linux/initrd.h> |
26 | #include <linux/hdreg.h> | ||
27 | #include <linux/bootmem.h> | 26 | #include <linux/bootmem.h> |
28 | #include <linux/tty.h> | 27 | #include <linux/tty.h> |
29 | #include <linux/gfp.h> | 28 | #include <linux/gfp.h> |
@@ -32,6 +31,7 @@ | |||
32 | #include <linux/kernel_stat.h> | 31 | #include <linux/kernel_stat.h> |
33 | #include <linux/start_kernel.h> | 32 | #include <linux/start_kernel.h> |
34 | #include <linux/security.h> | 33 | #include <linux/security.h> |
34 | #include <linux/smp.h> | ||
35 | #include <linux/workqueue.h> | 35 | #include <linux/workqueue.h> |
36 | #include <linux/profile.h> | 36 | #include <linux/profile.h> |
37 | #include <linux/rcupdate.h> | 37 | #include <linux/rcupdate.h> |
@@ -87,8 +87,6 @@ extern void init_IRQ(void); | |||
87 | extern void fork_init(unsigned long); | 87 | extern void fork_init(unsigned long); |
88 | extern void mca_init(void); | 88 | extern void mca_init(void); |
89 | extern void sbus_init(void); | 89 | extern void sbus_init(void); |
90 | extern void pidhash_init(void); | ||
91 | extern void pidmap_init(void); | ||
92 | extern void prio_tree_init(void); | 90 | extern void prio_tree_init(void); |
93 | extern void radix_tree_init(void); | 91 | extern void radix_tree_init(void); |
94 | extern void free_initmem(void); | 92 | extern void free_initmem(void); |
@@ -415,6 +413,13 @@ static void __init smp_init(void) | |||
415 | { | 413 | { |
416 | unsigned int cpu; | 414 | unsigned int cpu; |
417 | 415 | ||
416 | /* | ||
417 | * Set up the current CPU as possible to migrate to. | ||
418 | * The other ones will be done by cpu_up/cpu_down() | ||
419 | */ | ||
420 | cpu = smp_processor_id(); | ||
421 | cpu_set(cpu, cpu_active_map); | ||
422 | |||
418 | /* FIXME: This should be done in userspace --RR */ | 423 | /* FIXME: This should be done in userspace --RR */ |
419 | for_each_present_cpu(cpu) { | 424 | for_each_present_cpu(cpu) { |
420 | if (num_online_cpus() >= setup_max_cpus) | 425 | if (num_online_cpus() >= setup_max_cpus) |
@@ -636,9 +641,11 @@ asmlinkage void __init start_kernel(void) | |||
636 | 641 | ||
637 | #ifdef CONFIG_BLK_DEV_INITRD | 642 | #ifdef CONFIG_BLK_DEV_INITRD |
638 | if (initrd_start && !initrd_below_start_ok && | 643 | if (initrd_start && !initrd_below_start_ok && |
639 | initrd_start < min_low_pfn << PAGE_SHIFT) { | 644 | page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { |
640 | printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " | 645 | printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " |
641 | "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT); | 646 | "disabling it.\n", |
647 | page_to_pfn(virt_to_page((void *)initrd_start)), | ||
648 | min_low_pfn); | ||
642 | initrd_start = 0; | 649 | initrd_start = 0; |
643 | } | 650 | } |
644 | #endif | 651 | #endif |
@@ -691,7 +698,7 @@ asmlinkage void __init start_kernel(void) | |||
691 | rest_init(); | 698 | rest_init(); |
692 | } | 699 | } |
693 | 700 | ||
694 | static int __initdata initcall_debug; | 701 | static int initcall_debug; |
695 | 702 | ||
696 | static int __init initcall_debug_setup(char *str) | 703 | static int __init initcall_debug_setup(char *str) |
697 | { | 704 | { |
@@ -700,7 +707,7 @@ static int __init initcall_debug_setup(char *str) | |||
700 | } | 707 | } |
701 | __setup("initcall_debug", initcall_debug_setup); | 708 | __setup("initcall_debug", initcall_debug_setup); |
702 | 709 | ||
703 | static void __init do_one_initcall(initcall_t fn) | 710 | int do_one_initcall(initcall_t fn) |
704 | { | 711 | { |
705 | int count = preempt_count(); | 712 | int count = preempt_count(); |
706 | ktime_t t0, t1, delta; | 713 | ktime_t t0, t1, delta; |
@@ -708,7 +715,7 @@ static void __init do_one_initcall(initcall_t fn) | |||
708 | int result; | 715 | int result; |
709 | 716 | ||
710 | if (initcall_debug) { | 717 | if (initcall_debug) { |
711 | print_fn_descriptor_symbol("calling %s\n", fn); | 718 | printk("calling %pF @ %i\n", fn, task_pid_nr(current)); |
712 | t0 = ktime_get(); | 719 | t0 = ktime_get(); |
713 | } | 720 | } |
714 | 721 | ||
@@ -718,8 +725,8 @@ static void __init do_one_initcall(initcall_t fn) | |||
718 | t1 = ktime_get(); | 725 | t1 = ktime_get(); |
719 | delta = ktime_sub(t1, t0); | 726 | delta = ktime_sub(t1, t0); |
720 | 727 | ||
721 | print_fn_descriptor_symbol("initcall %s", fn); | 728 | printk("initcall %pF returned %d after %Ld msecs\n", |
722 | printk(" returned %d after %Ld msecs\n", result, | 729 | fn, result, |
723 | (unsigned long long) delta.tv64 >> 20); | 730 | (unsigned long long) delta.tv64 >> 20); |
724 | } | 731 | } |
725 | 732 | ||
@@ -737,19 +744,20 @@ static void __init do_one_initcall(initcall_t fn) | |||
737 | local_irq_enable(); | 744 | local_irq_enable(); |
738 | } | 745 | } |
739 | if (msgbuf[0]) { | 746 | if (msgbuf[0]) { |
740 | print_fn_descriptor_symbol(KERN_WARNING "initcall %s", fn); | 747 | printk("initcall %pF returned with %s\n", fn, msgbuf); |
741 | printk(" returned with %s\n", msgbuf); | ||
742 | } | 748 | } |
749 | |||
750 | return result; | ||
743 | } | 751 | } |
744 | 752 | ||
745 | 753 | ||
746 | extern initcall_t __initcall_start[], __initcall_end[]; | 754 | extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; |
747 | 755 | ||
748 | static void __init do_initcalls(void) | 756 | static void __init do_initcalls(void) |
749 | { | 757 | { |
750 | initcall_t *call; | 758 | initcall_t *call; |
751 | 759 | ||
752 | for (call = __initcall_start; call < __initcall_end; call++) | 760 | for (call = __early_initcall_end; call < __initcall_end; call++) |
753 | do_one_initcall(*call); | 761 | do_one_initcall(*call); |
754 | 762 | ||
755 | /* Make sure there is no pending stuff from the initcall sequence */ | 763 | /* Make sure there is no pending stuff from the initcall sequence */ |
@@ -765,6 +773,7 @@ static void __init do_initcalls(void) | |||
765 | */ | 773 | */ |
766 | static void __init do_basic_setup(void) | 774 | static void __init do_basic_setup(void) |
767 | { | 775 | { |
776 | rcu_init_sched(); /* needed by module_init stage. */ | ||
768 | /* drivers will send hotplug events */ | 777 | /* drivers will send hotplug events */ |
769 | init_workqueues(); | 778 | init_workqueues(); |
770 | usermodehelper_init(); | 779 | usermodehelper_init(); |
@@ -773,23 +782,12 @@ static void __init do_basic_setup(void) | |||
773 | do_initcalls(); | 782 | do_initcalls(); |
774 | } | 783 | } |
775 | 784 | ||
776 | static int __initdata nosoftlockup; | ||
777 | |||
778 | static int __init nosoftlockup_setup(char *str) | ||
779 | { | ||
780 | nosoftlockup = 1; | ||
781 | return 1; | ||
782 | } | ||
783 | __setup("nosoftlockup", nosoftlockup_setup); | ||
784 | |||
785 | static void __init do_pre_smp_initcalls(void) | 785 | static void __init do_pre_smp_initcalls(void) |
786 | { | 786 | { |
787 | extern int spawn_ksoftirqd(void); | 787 | initcall_t *call; |
788 | 788 | ||
789 | migration_init(); | 789 | for (call = __initcall_start; call < __early_initcall_end; call++) |
790 | spawn_ksoftirqd(); | 790 | do_one_initcall(*call); |
791 | if (!nosoftlockup) | ||
792 | spawn_softlockup_task(); | ||
793 | } | 791 | } |
794 | 792 | ||
795 | static void run_init_process(char *init_filename) | 793 | static void run_init_process(char *init_filename) |