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 1c3443d98105..2d5200e56357 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 | /* |
@@ -1325,26 +1327,24 @@ int native_cpu_disable(void) | |||
1325 | return ret; | 1327 | return ret; |
1326 | 1328 | ||
1327 | clear_local_APIC(); | 1329 | clear_local_APIC(); |
1328 | 1330 | init_completion(&per_cpu(die_complete, smp_processor_id())); | |
1329 | cpu_disable_common(); | 1331 | cpu_disable_common(); |
1332 | |||
1330 | return 0; | 1333 | return 0; |
1331 | } | 1334 | } |
1332 | 1335 | ||
1333 | void native_cpu_die(unsigned int cpu) | 1336 | void native_cpu_die(unsigned int cpu) |
1334 | { | 1337 | { |
1335 | /* We don't do anything here: idle task is faking death itself. */ | 1338 | /* We don't do anything here: idle task is faking death itself. */ |
1336 | unsigned int i; | 1339 | wait_for_completion_timeout(&per_cpu(die_complete, cpu), HZ); |
1337 | 1340 | ||
1338 | for (i = 0; i < 10; i++) { | 1341 | /* They ack this in play_dead() by setting CPU_DEAD */ |
1339 | /* They ack this in play_dead by setting CPU_DEAD */ | 1342 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { |
1340 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { | 1343 | if (system_state == SYSTEM_RUNNING) |
1341 | if (system_state == SYSTEM_RUNNING) | 1344 | pr_info("CPU %u is now offline\n", cpu); |
1342 | pr_info("CPU %u is now offline\n", cpu); | 1345 | } else { |
1343 | return; | 1346 | pr_err("CPU %u didn't die...\n", cpu); |
1344 | } | ||
1345 | msleep(100); | ||
1346 | } | 1347 | } |
1347 | pr_err("CPU %u didn't die...\n", cpu); | ||
1348 | } | 1348 | } |
1349 | 1349 | ||
1350 | void play_dead_common(void) | 1350 | void play_dead_common(void) |
@@ -1356,6 +1356,7 @@ void play_dead_common(void) | |||
1356 | mb(); | 1356 | mb(); |
1357 | /* Ack it */ | 1357 | /* Ack it */ |
1358 | __this_cpu_write(cpu_state, CPU_DEAD); | 1358 | __this_cpu_write(cpu_state, CPU_DEAD); |
1359 | complete(&per_cpu(die_complete, smp_processor_id())); | ||
1359 | 1360 | ||
1360 | /* | 1361 | /* |
1361 | * With physical CPU hotplug, we should halt the cpu | 1362 | * With physical CPU hotplug, we should halt the cpu |