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

Commit 6ddd2a27 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar
Browse files

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 9e26d842
Loading
Loading
Loading
Loading
+7 −11
Original line number Original line Diff line number Diff line
@@ -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)
+1 −6
Original line number Original line Diff line number Diff line
@@ -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();
+2 −5
Original line number Original line Diff line number Diff line
@@ -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)
			 */
			 */
			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. */