提交 6ddd2a27 编写于 作者: T Thomas Gleixner 提交者: Ingo Molnar

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: NThomas Gleixner <tglx@linutronix.de>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 9e26d842
...@@ -139,27 +139,23 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) ...@@ -139,27 +139,23 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)
void __cpuinit select_idle_routine(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 #ifdef CONFIG_X86_SMP
if (pm_idle == poll_idle && smp_num_siblings > 1) { if (pm_idle == poll_idle && smp_num_siblings > 1) {
printk(KERN_WARNING "WARNING: polling idle and HT enabled," printk(KERN_WARNING "WARNING: polling idle and HT enabled,"
" performance may degrade.\n"); " performance may degrade.\n");
} }
#endif #endif
if (pm_idle)
return;
if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) { if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
/* /*
* Skip, if setup has overridden idle.
* One CPU supports mwait => All CPUs supports mwait * One CPU supports mwait => All CPUs supports mwait
*/ */
if (!pm_idle) { printk(KERN_INFO "using mwait in idle threads.\n");
printk(KERN_INFO "using mwait in idle threads.\n"); pm_idle = mwait_idle;
pm_idle = mwait_idle; } else
} pm_idle = default_idle;
}
selected = 1;
} }
static int __init idle_setup(char *str) static int __init idle_setup(char *str)
......
...@@ -168,24 +168,19 @@ void cpu_idle(void) ...@@ -168,24 +168,19 @@ void cpu_idle(void)
while (1) { while (1) {
tick_nohz_stop_sched_tick(); tick_nohz_stop_sched_tick();
while (!need_resched()) { while (!need_resched()) {
void (*idle)(void);
check_pgt_cache(); check_pgt_cache();
rmb(); rmb();
idle = pm_idle;
if (rcu_pending(cpu)) if (rcu_pending(cpu))
rcu_check_callbacks(cpu, 0); rcu_check_callbacks(cpu, 0);
if (!idle)
idle = default_idle;
if (cpu_is_offline(cpu)) if (cpu_is_offline(cpu))
play_dead(); play_dead();
local_irq_disable(); local_irq_disable();
__get_cpu_var(irq_stat).idle_timestamp = jiffies; __get_cpu_var(irq_stat).idle_timestamp = jiffies;
idle(); pm_idle();
} }
tick_nohz_restart_sched_tick(); tick_nohz_restart_sched_tick();
preempt_enable_no_resched(); preempt_enable_no_resched();
......
...@@ -150,12 +150,9 @@ void cpu_idle(void) ...@@ -150,12 +150,9 @@ void cpu_idle(void)
while (1) { while (1) {
tick_nohz_stop_sched_tick(); tick_nohz_stop_sched_tick();
while (!need_resched()) { while (!need_resched()) {
void (*idle)(void);
rmb(); rmb();
idle = pm_idle;
if (!idle)
idle = default_idle;
if (cpu_is_offline(smp_processor_id())) if (cpu_is_offline(smp_processor_id()))
play_dead(); play_dead();
/* /*
...@@ -165,7 +162,7 @@ void cpu_idle(void) ...@@ -165,7 +162,7 @@ void cpu_idle(void)
*/ */
local_irq_disable(); local_irq_disable();
enter_idle(); enter_idle();
idle(); pm_idle();
/* In many cases the interrupt that ended idle /* In many cases the interrupt that ended idle
has already called exit_idle. But some idle has already called exit_idle. But some idle
loops can be woken up without interrupt. */ loops can be woken up without interrupt. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册