Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ac87abb authored by Matt Evans's avatar Matt Evans Committed by Benjamin Herrenschmidt
Browse files

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: default avatarMatt Evans <matt@ozlabs.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 32d206eb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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");
}

+0 −1
Original line number Diff line number Diff line
@@ -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];
+3 −3
Original line number Diff line number Diff line
@@ -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");
}