aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/smpboot.c23
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);
102DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info); 102DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);
103EXPORT_PER_CPU_SYMBOL(cpu_info); 103EXPORT_PER_CPU_SYMBOL(cpu_info);
104 104
105static DEFINE_PER_CPU(struct completion, die_complete);
106
105atomic_t init_deasserted; 107atomic_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
1333void native_cpu_die(unsigned int cpu) 1336void 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
1350void play_dead_common(void) 1350void 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