diff options
-rw-r--r-- | arch/x86/kernel/smpboot.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 2d872e08fab9..fdbc5fce8b97 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -102,6 +102,8 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map); | |||
102 | DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); | 102 | DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); |
103 | EXPORT_PER_CPU_SYMBOL(cpu_info); | 103 | EXPORT_PER_CPU_SYMBOL(cpu_info); |
104 | 104 | ||
105 | static DEFINE_PER_CPU(struct completion, die_complete); | ||
106 | |||
105 | atomic_t init_deasserted; | 107 | atomic_t init_deasserted; |
106 | 108 | ||
107 | /* | 109 | /* |
@@ -1323,26 +1325,24 @@ int native_cpu_disable(void) | |||
1323 | return ret; | 1325 | return ret; |
1324 | 1326 | ||
1325 | clear_local_APIC(); | 1327 | clear_local_APIC(); |
1326 | 1328 | init_completion(&per_cpu(die_complete, smp_processor_id())); | |
1327 | cpu_disable_common(); | 1329 | cpu_disable_common(); |
1330 | |||
1328 | return 0; | 1331 | return 0; |
1329 | } | 1332 | } |
1330 | 1333 | ||
1331 | void native_cpu_die(unsigned int cpu) | 1334 | void native_cpu_die(unsigned int cpu) |
1332 | { | 1335 | { |
1333 | /* We don't do anything here: idle task is faking death itself. */ | 1336 | /* We don't do anything here: idle task is faking death itself. */ |
1334 | unsigned int i; | 1337 | wait_for_completion_timeout(&per_cpu(die_complete, cpu), HZ); |
1335 | 1338 | ||
1336 | for (i = 0; i < 10; i++) { | 1339 | /* They ack this in play_dead() by setting CPU_DEAD */ |
1337 | /* They ack this in play_dead by setting CPU_DEAD */ | 1340 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { |
1338 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { | 1341 | if (system_state == SYSTEM_RUNNING) |
1339 | if (system_state == SYSTEM_RUNNING) | 1342 | pr_info("CPU %u is now offline\n", cpu); |
1340 | pr_info("CPU %u is now offline\n", cpu); | 1343 | } else { |
1341 | return; | 1344 | pr_err("CPU %u didn't die...\n", cpu); |
1342 | } | ||
1343 | msleep(100); | ||
1344 | } | 1345 | } |
1345 | pr_err("CPU %u didn't die...\n", cpu); | ||
1346 | } | 1346 | } |
1347 | 1347 | ||
1348 | void play_dead_common(void) | 1348 | void play_dead_common(void) |
@@ -1354,6 +1354,7 @@ void play_dead_common(void) | |||
1354 | mb(); | 1354 | mb(); |
1355 | /* Ack it */ | 1355 | /* Ack it */ |
1356 | __this_cpu_write(cpu_state, CPU_DEAD); | 1356 | __this_cpu_write(cpu_state, CPU_DEAD); |
1357 | complete(&per_cpu(die_complete, smp_processor_id())); | ||
1357 | 1358 | ||
1358 | /* | 1359 | /* |
1359 | * With physical CPU hotplug, we should halt the cpu | 1360 | * With physical CPU hotplug, we should halt the cpu |