powerpc: Replace boot_cpu_count with spinning_secondaries, fix off-by-one cpu wait
PATCH 1/1 powerpc: Replace boot_cpu_count with spinning_secondaries, fix off-by-one cpu wait
smp_release_cpus() waits for all cpus (including the bootcpu) due to an off-by-one count on boot_cpu_count (which is all CPUs). This patch replaces that with spinning_secondaries (which is all secondary CPUs).
Signed-off-by Matt Evans <[email protected]>
--- arch/powerpc/include/asm/smp.h | 2 +- arch/powerpc/kernel/head_64.S | 2 +- arch/powerpc/kernel/prom.c | 8 ++++++++ arch/powerpc/kernel/setup_32.c | 1 - arch/powerpc/kernel/setup_64.c | 6 +++--- 5 files changed, 13 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/smp.h +1 -1
@@ -30,7 +30,7 @@#include <asm/percpu.h> extern int boot_cpuid; -extern int boot_cpu_count; +extern int spinning_secondaries;extern void cpu_die (void );
arch/powerpc/kernel/head_64.S +1 -1
@@ -255,7 +255,7 @@ generic_secondary_common_init: mtctr r23 bctrl -3: LOAD_REG_ADDR(r3, boot_cpu_count) /* Decrement boot_cpu_count */ +3: LOAD_REG_ADDR(r3, spinning_secondaries) /* Decrement spinning_secondaries */ lwarx r4,0,r3 subi r4,r4,1 stwcx. r4,0,r3
arch/powerpc/kernel/prom.c +8 -0
@@ -69,6 +69,7 @@ unsigned long tce_alloc_start, tce_alloc_end;u64 ppc64_rma_size;#endif static phys_addr_t first_memblock_size; +static int __initdata boot_cpu_count;static int __init early_parse_mem (char *p) {
@@ -748,6 +749,13 @@ void __init early_init_devtree(void *params)*/ of_scan_flat_dt (early_init_dt_scan_cpus,NULL ); +#if defined(CONFIG_SMP ) && defined(CONFIG_PPC64 ) +/* We'll later wait for secondaries to check in; there are +* NCPUS-1 non-boot CPUs :-) +*/ + spinning_secondaries = boot_cpu_count -1 ; +#endif +DBG (" <- early_init_devtree()\n" ); }
arch/powerpc/kernel/setup_32.c +0 -1
@@ -48,7 +48,6 @@ extern void bootx_init(unsigned long r4, unsigned long phys);int boot_cpuid =-1 ;EXPORT_SYMBOL_GPL (boot_cpuid); -int __initdata boot_cpu_count;int boot_cpuid_phys;int smp_hw_index[NR_CPUS ];
arch/powerpc/kernel/setup_64.c +3 -3
@@ -73,7 +73,7 @@#endif int boot_cpuid =0 ; -int __initdata boot_cpu_count; +int __initdata spinning_secondaries;u64 ppc64_pft_size;/* Pick defaults since we might want to patch instructions
@@ -253,11 +253,11 @@ void smp_release_cpus(void)for (i =0 ; i <100000 ; i++) {mb ();HMT_low (); -if (boot_cpu_count ==0 ) +if (spinning_secondaries ==0 )break ;udelay (1 ); } -DBG ("boot_cpu_count = %d\n" , boot_cpu_count); +DBG ("spinning_secondaries = %d\n" , spinning_secondaries);DBG (" <- smp_release_cpus()\n" ); }
Signature · 3 lines
1.7.0.4 0