powerpc: Fix early boot accounting of CPUs
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 <matt@ozlabs.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
32d206eb56
Коммит
7ac87abb81
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче