tile: Use generic idle loop
Signed-off-by: Thomas 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: Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Cc: Magnus Damm <magnus.damm@gmail.com> Acked-by: Chris Metcalf <cmetcalf@tilera.com> Link: http://lkml.kernel.org/r/20130321215235.348460344@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
e26ef8fe72
commit
0dc8153cfe
3 changed files with 11 additions and 57 deletions
|
@ -22,6 +22,7 @@ config TILE
|
|||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select MODULES_USE_ELF_RELA
|
||||
select GENERIC_IDLE_LOOP
|
||||
|
||||
# FIXME: investigate whether we need/want these options.
|
||||
# select HAVE_IOREMAP_PROT
|
||||
|
|
|
@ -40,13 +40,11 @@
|
|||
#include <arch/abi.h>
|
||||
#include <arch/sim_def.h>
|
||||
|
||||
|
||||
/*
|
||||
* Use the (x86) "idle=poll" option to prefer low latency when leaving the
|
||||
* idle loop over low power while in the idle loop, e.g. if we have
|
||||
* one thread per core and we want to get threads out of futex waits fast.
|
||||
*/
|
||||
static int no_idle_nap;
|
||||
static int __init idle_setup(char *str)
|
||||
{
|
||||
if (!str)
|
||||
|
@ -54,64 +52,19 @@ static int __init idle_setup(char *str)
|
|||
|
||||
if (!strcmp(str, "poll")) {
|
||||
pr_info("using polling idle threads.\n");
|
||||
no_idle_nap = 1;
|
||||
} else if (!strcmp(str, "halt"))
|
||||
no_idle_nap = 0;
|
||||
else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
cpu_idle_poll_ctrl(true);
|
||||
return 0;
|
||||
} else if (!strcmp(str, "halt")) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
early_param("idle", idle_setup);
|
||||
|
||||
/*
|
||||
* The idle thread. There's no useful work to be
|
||||
* done, so just try to conserve power and have a
|
||||
* low exit latency (ie sit in a loop waiting for
|
||||
* somebody to say that they'd like to reschedule)
|
||||
*/
|
||||
void cpu_idle(void)
|
||||
void arch_cpu_idle(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
|
||||
if (no_idle_nap) {
|
||||
while (1) {
|
||||
while (!need_resched())
|
||||
cpu_relax();
|
||||
schedule();
|
||||
}
|
||||
}
|
||||
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
tick_nohz_idle_enter();
|
||||
rcu_idle_enter();
|
||||
while (!need_resched()) {
|
||||
if (cpu_is_offline(cpu))
|
||||
BUG(); /* no HOTPLUG_CPU */
|
||||
|
||||
local_irq_disable();
|
||||
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
/*
|
||||
* TS_POLLING-cleared state must be visible before we
|
||||
* test NEED_RESCHED:
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
if (!need_resched())
|
||||
_cpu_idle();
|
||||
else
|
||||
local_irq_enable();
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
}
|
||||
rcu_idle_exit();
|
||||
tick_nohz_idle_exit();
|
||||
schedule_preempt_disabled();
|
||||
}
|
||||
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
|
||||
_cpu_idle();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -207,7 +207,7 @@ void __cpuinit online_secondary(void)
|
|||
/* Set up tile-timer clock-event device on this cpu */
|
||||
setup_tile_timer();
|
||||
|
||||
cpu_idle();
|
||||
cpu_startup_entry(CPUHP_ONLINE);
|
||||
}
|
||||
|
||||
int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
||||
|
|
Loading…
Reference in a new issue