x86: simplify idle selection
default_idle is selected in cpu_idle(), when no other idle routine is selected. Select it in select_idle_routine() when mwait is not selected. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
9e26d84273
commit
6ddd2a2794
@ -139,27 +139,23 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)
|
||||
|
||||
void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
static int selected;
|
||||
|
||||
if (selected)
|
||||
return;
|
||||
#ifdef CONFIG_X86_SMP
|
||||
if (pm_idle == poll_idle && smp_num_siblings > 1) {
|
||||
printk(KERN_WARNING "WARNING: polling idle and HT enabled,"
|
||||
" performance may degrade.\n");
|
||||
}
|
||||
#endif
|
||||
if (pm_idle)
|
||||
return;
|
||||
|
||||
if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
|
||||
/*
|
||||
* Skip, if setup has overridden idle.
|
||||
* One CPU supports mwait => All CPUs supports mwait
|
||||
*/
|
||||
if (!pm_idle) {
|
||||
printk(KERN_INFO "using mwait in idle threads.\n");
|
||||
pm_idle = mwait_idle;
|
||||
}
|
||||
}
|
||||
selected = 1;
|
||||
printk(KERN_INFO "using mwait in idle threads.\n");
|
||||
pm_idle = mwait_idle;
|
||||
} else
|
||||
pm_idle = default_idle;
|
||||
}
|
||||
|
||||
static int __init idle_setup(char *str)
|
||||
|
@ -168,24 +168,19 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
tick_nohz_stop_sched_tick();
|
||||
while (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
|
||||
check_pgt_cache();
|
||||
rmb();
|
||||
idle = pm_idle;
|
||||
|
||||
if (rcu_pending(cpu))
|
||||
rcu_check_callbacks(cpu, 0);
|
||||
|
||||
if (!idle)
|
||||
idle = default_idle;
|
||||
|
||||
if (cpu_is_offline(cpu))
|
||||
play_dead();
|
||||
|
||||
local_irq_disable();
|
||||
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
|
||||
idle();
|
||||
pm_idle();
|
||||
}
|
||||
tick_nohz_restart_sched_tick();
|
||||
preempt_enable_no_resched();
|
||||
|
@ -150,12 +150,9 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
tick_nohz_stop_sched_tick();
|
||||
while (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
|
||||
rmb();
|
||||
idle = pm_idle;
|
||||
if (!idle)
|
||||
idle = default_idle;
|
||||
|
||||
if (cpu_is_offline(smp_processor_id()))
|
||||
play_dead();
|
||||
/*
|
||||
@ -165,7 +162,7 @@ void cpu_idle(void)
|
||||
*/
|
||||
local_irq_disable();
|
||||
enter_idle();
|
||||
idle();
|
||||
pm_idle();
|
||||
/* In many cases the interrupt that ended idle
|
||||
has already called exit_idle. But some idle
|
||||
loops can be woken up without interrupt. */
|
||||
|
Loading…
Reference in New Issue
Block a user