summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/ppc64/kernel/prom.c2
-rw-r--r--arch/ppc64/kernel/setup.c11
-rw-r--r--arch/ppc64/kernel/smp.c8
-rw-r--r--include/asm-ppc64/smp.h1
4 files changed, 14 insertions, 8 deletions
diff --git a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
index 3225df3d9a40..62e5f3354df7 100644
--- a/arch/ppc64/kernel/prom.c
+++ b/arch/ppc64/kernel/prom.c
@@ -1076,6 +1076,8 @@ next:
cpu_set(cpuid, RELOC(cpu_available_map));
cpu_set(cpuid, RELOC(cpu_present_at_boot));
cpu_set(cpuid, RELOC(cpu_present_map));
+ cpu_set(cpuid, RELOC(cpu_possible_map));
+ _systemcfg->processorCount++;
prom_printf("available\n");
} else {
prom_printf("not available\n");
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c
index dc090d425e21..5872cc027ae5 100644
--- a/arch/ppc64/kernel/setup.c
+++ b/arch/ppc64/kernel/setup.c
@@ -232,16 +232,17 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
chrp_init(r3, r4, r5, r6, r7);
#ifdef CONFIG_SMP
- /* Start secondary threads on SMT systems */
- for (i = 0; i < NR_CPUS; i++) {
- if (cpu_available(i) && !cpu_possible(i)) {
+ /* Start secondary threads on SMT systems; primary threads
+ * are already in the running state.
+ */
+ for_each_present_cpu(i) {
+ if (query_cpu_stopped
+ (get_hard_smp_processor_id(i)) == 0) {
printk("%16.16x : starting thread\n", i);
rtas_call(rtas_token("start-cpu"), 3, 1, &ret,
get_hard_smp_processor_id(i),
(u32)*((unsigned long *)pseries_secondary_smp_init),
i);
- cpu_set(i, cpu_possible_map);
- systemcfg->processorCount++;
}
}
#endif /* CONFIG_SMP */
diff --git a/arch/ppc64/kernel/smp.c b/arch/ppc64/kernel/smp.c
index 9f158790d3e1..d7f70022421a 100644
--- a/arch/ppc64/kernel/smp.c
+++ b/arch/ppc64/kernel/smp.c
@@ -225,7 +225,6 @@ static void __devinit smp_openpic_setup_cpu(int cpu)
do_openpic_setup_cpu();
}
-#ifdef CONFIG_HOTPLUG_CPU
/* Get state of physical CPU.
* Return codes:
* 0 - The processor is in the RTAS stopped state
@@ -234,13 +233,14 @@ static void __devinit smp_openpic_setup_cpu(int cpu)
* -1 - Hardware Error
* -2 - Hardware Busy, Try again later.
*/
-static int query_cpu_stopped(unsigned int pcpu)
+int query_cpu_stopped(unsigned int pcpu)
{
int cpu_status;
int status, qcss_tok;
qcss_tok = rtas_token("query-cpu-stopped-state");
- BUG_ON(qcss_tok == RTAS_UNKNOWN_SERVICE);
+ if (qcss_tok == RTAS_UNKNOWN_SERVICE)
+ return -1;
status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu);
if (status != 0) {
printk(KERN_ERR
@@ -251,6 +251,8 @@ static int query_cpu_stopped(unsigned int pcpu)
return cpu_status;
}
+#ifdef CONFIG_HOTPLUG_CPU
+
int __cpu_disable(void)
{
/* FIXME: go put this in a header somewhere */
diff --git a/include/asm-ppc64/smp.h b/include/asm-ppc64/smp.h
index 139e88e5018a..f51ef31cc1ce 100644
--- a/include/asm-ppc64/smp.h
+++ b/include/asm-ppc64/smp.h
@@ -73,6 +73,7 @@ void smp_init_pSeries(void);
extern int __cpu_disable(void);
extern void __cpu_die(unsigned int cpu);
extern void cpu_die(void) __attribute__((noreturn));
+extern int query_cpu_stopped(unsigned int pcpu);
#endif /* !(CONFIG_SMP) */
#define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id)