diff options
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/init/main.c b/init/main.c index c8c9a0b21e99..d3bcb3b11620 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -132,20 +132,9 @@ static char *static_command_line; | |||
132 | static char *execute_command; | 132 | static char *execute_command; |
133 | static char *ramdisk_execute_command; | 133 | static char *ramdisk_execute_command; |
134 | 134 | ||
135 | #ifdef CONFIG_SMP | ||
135 | /* Setup configured maximum number of CPUs to activate */ | 136 | /* Setup configured maximum number of CPUs to activate */ |
136 | static unsigned int max_cpus = NR_CPUS; | 137 | static unsigned int __initdata max_cpus = NR_CPUS; |
137 | |||
138 | /* | ||
139 | * If set, this is an indication to the drivers that reset the underlying | ||
140 | * device before going ahead with the initialization otherwise driver might | ||
141 | * rely on the BIOS and skip the reset operation. | ||
142 | * | ||
143 | * This is useful if kernel is booting in an unreliable environment. | ||
144 | * For ex. kdump situaiton where previous kernel has crashed, BIOS has been | ||
145 | * skipped and devices will be in unknown state. | ||
146 | */ | ||
147 | unsigned int reset_devices; | ||
148 | EXPORT_SYMBOL(reset_devices); | ||
149 | 138 | ||
150 | /* | 139 | /* |
151 | * Setup routine for controlling SMP activation | 140 | * Setup routine for controlling SMP activation |
@@ -160,10 +149,10 @@ EXPORT_SYMBOL(reset_devices); | |||
160 | static int __init nosmp(char *str) | 149 | static int __init nosmp(char *str) |
161 | { | 150 | { |
162 | max_cpus = 0; | 151 | max_cpus = 0; |
163 | return 1; | 152 | return 0; |
164 | } | 153 | } |
165 | 154 | ||
166 | __setup("nosmp", nosmp); | 155 | early_param("nosmp", nosmp); |
167 | 156 | ||
168 | static int __init maxcpus(char *str) | 157 | static int __init maxcpus(char *str) |
169 | { | 158 | { |
@@ -172,6 +161,21 @@ static int __init maxcpus(char *str) | |||
172 | } | 161 | } |
173 | 162 | ||
174 | __setup("maxcpus=", maxcpus); | 163 | __setup("maxcpus=", maxcpus); |
164 | #else | ||
165 | #define max_cpus NR_CPUS | ||
166 | #endif | ||
167 | |||
168 | /* | ||
169 | * If set, this is an indication to the drivers that reset the underlying | ||
170 | * device before going ahead with the initialization otherwise driver might | ||
171 | * rely on the BIOS and skip the reset operation. | ||
172 | * | ||
173 | * This is useful if kernel is booting in an unreliable environment. | ||
174 | * For ex. kdump situaiton where previous kernel has crashed, BIOS has been | ||
175 | * skipped and devices will be in unknown state. | ||
176 | */ | ||
177 | unsigned int reset_devices; | ||
178 | EXPORT_SYMBOL(reset_devices); | ||
175 | 179 | ||
176 | static int __init set_reset_devices(char *str) | 180 | static int __init set_reset_devices(char *str) |
177 | { | 181 | { |
@@ -385,6 +389,10 @@ static void __init smp_init(void) | |||
385 | { | 389 | { |
386 | unsigned int cpu; | 390 | unsigned int cpu; |
387 | 391 | ||
392 | #ifndef CONFIG_HOTPLUG_CPU | ||
393 | cpu_possible_map = cpu_present_map; | ||
394 | #endif | ||
395 | |||
388 | /* FIXME: This should be done in userspace --RR */ | 396 | /* FIXME: This should be done in userspace --RR */ |
389 | for_each_present_cpu(cpu) { | 397 | for_each_present_cpu(cpu) { |
390 | if (num_online_cpus() >= max_cpus) | 398 | if (num_online_cpus() >= max_cpus) |
@@ -529,6 +537,10 @@ asmlinkage void __init start_kernel(void) | |||
529 | setup_arch(&command_line); | 537 | setup_arch(&command_line); |
530 | setup_command_line(command_line); | 538 | setup_command_line(command_line); |
531 | unwind_setup(); | 539 | unwind_setup(); |
540 | #ifndef CONFIG_HOTPLUG_CPU | ||
541 | if (max_cpus < 2) | ||
542 | cpu_possible_map = cpu_online_map; | ||
543 | #endif | ||
532 | setup_per_cpu_areas(); | 544 | setup_per_cpu_areas(); |
533 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ | 545 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ |
534 | 546 | ||