diff options
| -rw-r--r-- | arch/ppc64/kernel/prom.c | 2 | ||||
| -rw-r--r-- | arch/ppc64/kernel/setup.c | 11 | ||||
| -rw-r--r-- | arch/ppc64/kernel/smp.c | 8 | ||||
| -rw-r--r-- | include/asm-ppc64/smp.h | 1 |
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) |
