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

Commit 799fef06 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

powerpc: Use generic idle loop



Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: default avatarCc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: Magnus Damm <magnus.damm@gmail.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Link: http://lkml.kernel.org/r/20130321215235.026838003@linutronix.de


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent fad48ad6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ config PPC
	select HAVE_ARCH_JUMP_LABEL
	select ARCH_HAVE_NMI_SAFE_CMPXCHG
	select GENERIC_SMP_IDLE_THREAD
	select GENERIC_IDLE_LOOP
	select GENERIC_CMOS_UPDATE
	select GENERIC_TIME_VSYSCALL_OLD
	select GENERIC_CLOCKEVENTS
+29 −60
Original line number Diff line number Diff line
@@ -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,45 +45,28 @@ 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();
	sched_preempt_enable_no_resched();
	cpu_die();
}
#endif

		while (!need_resched() && !cpu_should_die()) {
void arch_cpu_idle(void)
{
	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
		/*
		 * Some power_save functions return with
		 * interrupts enabled, some don't.
		 */
		if (irqs_disabled())
			local_irq_enable();
				set_thread_flag(TIF_POLLING_NRFLAG);

	} else {
		local_irq_enable();
		/*
		 * Go into low thread priority and possibly
		 * low power mode.
@@ -96,18 +74,9 @@ void cpu_idle(void)
		HMT_low();
		HMT_very_low();
	}
		}

	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();
	}
}

int powersave_nap;
+1 −1
Original line number Diff line number Diff line
@@ -669,7 +669,7 @@ __cpuinit void start_secondary(void *unused)

	local_irq_enable();

	cpu_idle();
	cpu_startup_entry(CPUHP_ONLINE);

	BUG();
}