diff options
Diffstat (limited to 'arch/powerpc/kernel/idle.c')
| -rw-r--r-- | arch/powerpc/kernel/idle.c | 87 | 
1 files changed, 28 insertions, 59 deletions
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c index ea78761aa16..939ea7ef0dc 100644 --- a/arch/powerpc/kernel/idle.c +++ b/arch/powerpc/kernel/idle.c @@ -33,11 +33,6 @@  #include <asm/runlatch.h>  #include <asm/smp.h> -#ifdef CONFIG_HOTPLUG_CPU -#define cpu_should_die()	cpu_is_offline(smp_processor_id()) -#else -#define cpu_should_die()	0 -#endif  unsigned long cpuidle_disable = IDLE_NO_OVERRIDE;  EXPORT_SYMBOL(cpuidle_disable); @@ -50,64 +45,38 @@ static int __init powersave_off(char *arg)  }  __setup("powersave=off", powersave_off); -/* - * The body of the idle task. - */ -void cpu_idle(void) +#ifdef CONFIG_HOTPLUG_CPU +void arch_cpu_idle_dead(void)  { -	set_thread_flag(TIF_POLLING_NRFLAG); -	while (1) { -		tick_nohz_idle_enter(); -		rcu_idle_enter(); - -		while (!need_resched() && !cpu_should_die()) { -			ppc64_runlatch_off(); - -			if (ppc_md.power_save) { -				clear_thread_flag(TIF_POLLING_NRFLAG); -				/* -				 * smp_mb is so clearing of TIF_POLLING_NRFLAG -				 * is ordered w.r.t. need_resched() test. -				 */ -				smp_mb(); -				local_irq_disable(); - -				/* Don't trace irqs off for idle */ -				stop_critical_timings(); - -				/* check again after disabling irqs */ -				if (!need_resched() && !cpu_should_die()) -					ppc_md.power_save(); - -				start_critical_timings(); - -				/* Some power_save functions return with -				 * interrupts enabled, some don't. -				 */ -				if (irqs_disabled()) -					local_irq_enable(); -				set_thread_flag(TIF_POLLING_NRFLAG); +	sched_preempt_enable_no_resched(); +	cpu_die(); +} +#endif -			} else { -				/* -				 * Go into low thread priority and possibly -				 * low power mode. -				 */ -				HMT_low(); -				HMT_very_low(); -			} -		} +void arch_cpu_idle(void) +{ +	ppc64_runlatch_off(); -		HMT_medium(); -		ppc64_runlatch_on(); -		rcu_idle_exit(); -		tick_nohz_idle_exit(); -		if (cpu_should_die()) { -			sched_preempt_enable_no_resched(); -			cpu_die(); -		} -		schedule_preempt_disabled(); +	if (ppc_md.power_save) { +		ppc_md.power_save(); +		/* +		 * Some power_save functions return with +		 * interrupts enabled, some don't. +		 */ +		if (irqs_disabled()) +			local_irq_enable(); +	} else { +		local_irq_enable(); +		/* +		 * Go into low thread priority and possibly +		 * low power mode. +		 */ +		HMT_low(); +		HMT_very_low();  	} + +	HMT_medium(); +	ppc64_runlatch_on();  }  int powersave_nap;  |