diff options
Diffstat (limited to 'kernel/cpu.c')
| -rw-r--r-- | kernel/cpu.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 14d32588cccd..f560598807c1 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -280,12 +280,13 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) | |||
| 280 | __func__, cpu); | 280 | __func__, cpu); |
| 281 | goto out_release; | 281 | goto out_release; |
| 282 | } | 282 | } |
| 283 | smpboot_park_threads(cpu); | ||
| 283 | 284 | ||
| 284 | err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu)); | 285 | err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu)); |
| 285 | if (err) { | 286 | if (err) { |
| 286 | /* CPU didn't die: tell everyone. Can't complain. */ | 287 | /* CPU didn't die: tell everyone. Can't complain. */ |
| 288 | smpboot_unpark_threads(cpu); | ||
| 287 | cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu); | 289 | cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu); |
| 288 | |||
| 289 | goto out_release; | 290 | goto out_release; |
| 290 | } | 291 | } |
| 291 | BUG_ON(cpu_online(cpu)); | 292 | BUG_ON(cpu_online(cpu)); |
| @@ -354,6 +355,10 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) | |||
| 354 | goto out; | 355 | goto out; |
| 355 | } | 356 | } |
| 356 | 357 | ||
| 358 | ret = smpboot_create_threads(cpu); | ||
| 359 | if (ret) | ||
| 360 | goto out; | ||
| 361 | |||
| 357 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); | 362 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); |
| 358 | if (ret) { | 363 | if (ret) { |
| 359 | nr_calls--; | 364 | nr_calls--; |
| @@ -368,6 +373,9 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) | |||
| 368 | goto out_notify; | 373 | goto out_notify; |
| 369 | BUG_ON(!cpu_online(cpu)); | 374 | BUG_ON(!cpu_online(cpu)); |
| 370 | 375 | ||
| 376 | /* Wake the per cpu threads */ | ||
| 377 | smpboot_unpark_threads(cpu); | ||
| 378 | |||
| 371 | /* Now call notifier in preparation. */ | 379 | /* Now call notifier in preparation. */ |
| 372 | cpu_notify(CPU_ONLINE | mod, hcpu); | 380 | cpu_notify(CPU_ONLINE | mod, hcpu); |
| 373 | 381 | ||
| @@ -439,14 +447,6 @@ EXPORT_SYMBOL_GPL(cpu_up); | |||
| 439 | #ifdef CONFIG_PM_SLEEP_SMP | 447 | #ifdef CONFIG_PM_SLEEP_SMP |
| 440 | static cpumask_var_t frozen_cpus; | 448 | static cpumask_var_t frozen_cpus; |
| 441 | 449 | ||
| 442 | void __weak arch_disable_nonboot_cpus_begin(void) | ||
| 443 | { | ||
| 444 | } | ||
| 445 | |||
| 446 | void __weak arch_disable_nonboot_cpus_end(void) | ||
| 447 | { | ||
| 448 | } | ||
| 449 | |||
| 450 | int disable_nonboot_cpus(void) | 450 | int disable_nonboot_cpus(void) |
| 451 | { | 451 | { |
| 452 | int cpu, first_cpu, error = 0; | 452 | int cpu, first_cpu, error = 0; |
| @@ -458,7 +458,6 @@ int disable_nonboot_cpus(void) | |||
| 458 | * with the userspace trying to use the CPU hotplug at the same time | 458 | * with the userspace trying to use the CPU hotplug at the same time |
| 459 | */ | 459 | */ |
| 460 | cpumask_clear(frozen_cpus); | 460 | cpumask_clear(frozen_cpus); |
| 461 | arch_disable_nonboot_cpus_begin(); | ||
| 462 | 461 | ||
| 463 | printk("Disabling non-boot CPUs ...\n"); | 462 | printk("Disabling non-boot CPUs ...\n"); |
| 464 | for_each_online_cpu(cpu) { | 463 | for_each_online_cpu(cpu) { |
| @@ -474,8 +473,6 @@ int disable_nonboot_cpus(void) | |||
| 474 | } | 473 | } |
| 475 | } | 474 | } |
| 476 | 475 | ||
| 477 | arch_disable_nonboot_cpus_end(); | ||
| 478 | |||
| 479 | if (!error) { | 476 | if (!error) { |
| 480 | BUG_ON(num_online_cpus() > 1); | 477 | BUG_ON(num_online_cpus() > 1); |
| 481 | /* Make sure the CPUs won't be enabled by someone else */ | 478 | /* Make sure the CPUs won't be enabled by someone else */ |
