diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 5c330c3366e42e2ec500cd8fe98fbdd7c94c3bc8..36d67a8d7cbbb1b1d2c798dc0958f4f5d792e756 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -510,6 +510,7 @@ int __devinit start_secondary(void *unused)
 
 	smp_store_cpu_info(cpu);
 	set_dec(tb_ticks_per_jiffy);
+	preempt_disable();
 	cpu_callin_map[cpu] = 1;
 
 	smp_ops->setup_cpu(cpu);
diff --git a/arch/ppc/kernel/idle.c b/arch/ppc/kernel/idle.c
index 3c4e4cb610743e070d7237ed7df5fff2fa67c75e..821a75e45602b9c42abd3de2f0d1949cb7f0f48e 100644
--- a/arch/ppc/kernel/idle.c
+++ b/arch/ppc/kernel/idle.c
@@ -63,7 +63,7 @@ void cpu_idle(void)
 	int cpu = smp_processor_id();
 
 	for (;;) {
-		while (need_resched()) {
+		while (!need_resched()) {
 			if (ppc_md.idle != NULL)
 				ppc_md.idle();
 			else