diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-02-10 22:09:32 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2011-04-01 00:37:16 -0400 |
commit | fb49f864c3c3f8ac5b68563774171fe43634ffeb (patch) | |
tree | c10d14ef80f971b73e718333f407cd0ceb51699d /arch/powerpc/platforms/powermac | |
parent | 7a53a4fe707a93a33f6c5d42173bf213cb6ff71d (diff) |
powerpc/pmac/smp: Fix 32-bit PowerMac cpu_die
Use generic cpu_state, call idle_task_exit() properly, and
remove smp_core99_cpu_die() which isn't useful, the generic
function does the job just fine.
Diffstat (limited to 'arch/powerpc/platforms/powermac')
-rw-r--r-- | arch/powerpc/platforms/powermac/smp.c | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index ebd2b7e037f0..e0ac7bb77f29 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -880,31 +880,17 @@ int smp_core99_cpu_disable(void) | |||
880 | return 0; | 880 | return 0; |
881 | } | 881 | } |
882 | 882 | ||
883 | static int cpu_dead[NR_CPUS]; | ||
884 | |||
885 | void pmac32_cpu_die(void) | 883 | void pmac32_cpu_die(void) |
886 | { | 884 | { |
887 | local_irq_disable(); | 885 | local_irq_disable(); |
888 | cpu_dead[smp_processor_id()] = 1; | 886 | idle_task_exit(); |
887 | printk(KERN_DEBUG "CPU%d offline\n", smp_processor_id()); | ||
888 | __get_cpu_var(cpu_state) = CPU_DEAD; | ||
889 | smp_wmb(); | ||
889 | mb(); | 890 | mb(); |
890 | low_cpu_die(); | 891 | low_cpu_die(); |
891 | } | 892 | } |
892 | 893 | ||
893 | void smp_core99_cpu_die(unsigned int cpu) | ||
894 | { | ||
895 | int timeout; | ||
896 | |||
897 | timeout = 1000; | ||
898 | while (!cpu_dead[cpu]) { | ||
899 | if (--timeout == 0) { | ||
900 | printk("CPU %u refused to die!\n", cpu); | ||
901 | break; | ||
902 | } | ||
903 | msleep(1); | ||
904 | } | ||
905 | cpu_dead[cpu] = 0; | ||
906 | } | ||
907 | |||
908 | #endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */ | 894 | #endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */ |
909 | 895 | ||
910 | /* Core99 Macs (dual G4s and G5s) */ | 896 | /* Core99 Macs (dual G4s and G5s) */ |
@@ -918,12 +904,11 @@ struct smp_ops_t core99_smp_ops = { | |||
918 | #if defined(CONFIG_HOTPLUG_CPU) | 904 | #if defined(CONFIG_HOTPLUG_CPU) |
919 | # if defined(CONFIG_PPC32) | 905 | # if defined(CONFIG_PPC32) |
920 | .cpu_disable = smp_core99_cpu_disable, | 906 | .cpu_disable = smp_core99_cpu_disable, |
921 | .cpu_die = smp_core99_cpu_die, | ||
922 | # endif | 907 | # endif |
923 | # if defined(CONFIG_PPC64) | 908 | # if defined(CONFIG_PPC64) |
924 | .cpu_disable = generic_cpu_disable, | 909 | .cpu_disable = generic_cpu_disable, |
925 | .cpu_die = generic_cpu_die, | ||
926 | # endif | 910 | # endif |
911 | .cpu_die = generic_cpu_die, | ||
927 | #endif | 912 | #endif |
928 | }; | 913 | }; |
929 | 914 | ||