From: Shaohua Li Dead CPU notifies online CPU that it's dead using cpu_state variable. After switching to physical cpu hotplug, we forgot setting the variable. This patch fixes it. Currently only __cpu_die uses it. We changed other locations for consistency in case others use it. Signed-off-by: Shaohua Li Acked-by: Ashok Raj Signed-off-by: Andrew Morton --- arch/x86_64/kernel/smpboot.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN arch/x86_64/kernel/smpboot.c~x86_64-dont-use-broadcast-shortcut-to-make-it-cpu-hotplug-safe-fix-set-cpu_state-for-cpu-hotplug arch/x86_64/kernel/smpboot.c --- 25/arch/x86_64/kernel/smpboot.c~x86_64-dont-use-broadcast-shortcut-to-make-it-cpu-hotplug-safe-fix-set-cpu_state-for-cpu-hotplug 2005-06-15 00:01:47.000000000 -0700 +++ 25-akpm/arch/x86_64/kernel/smpboot.c 2005-06-15 00:01:47.000000000 -0700 @@ -521,6 +521,7 @@ void __cpuinit start_secondary(void) * Allow the master to continue. */ cpu_set(smp_processor_id(), cpu_online_map); + per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; unlock_ipi_call_lock(); mb(); @@ -1050,6 +1051,7 @@ void __init smp_prepare_boot_cpu(void) cpu_set(me, cpu_callout_map); cpu_set(0, cpu_sibling_map[0]); cpu_set(0, cpu_core_map[0]); + per_cpu(cpu_state, me) = CPU_ONLINE; } /* @@ -1078,6 +1080,7 @@ int __cpuinit __cpu_up(unsigned int cpu) return -ENOSYS; } + per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; /* Boot it! */ err = do_boot_cpu(cpu, apicid); if (err < 0) { @@ -1182,8 +1185,10 @@ void __cpu_die(unsigned int cpu) for (i = 0; i < 10; i++) { /* They ack this in play_dead by setting CPU_DEAD */ - if (per_cpu(cpu_state, cpu) == CPU_DEAD) + if (per_cpu(cpu_state, cpu) == CPU_DEAD) { + printk ("CPU %d is now offline\n", cpu); return; + } current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(HZ/10); } _