Commit f4b0a775 authored by Anton Blanchard's avatar Anton Blanchard Committed by Linus Torvalds

[PATCH] ppc64: enable POWER5 low power mode in idle loop

Now that we understand (and have fixed) the problem with using low power mode
in the idle loop, lets enable it.  It should save a fair amount of power.

(The problem was that our exceptions were inheriting the low power mode and so
were executing at a fraction of the normal cpu issue rate.  We fixed it by
always bumping our priority to medium at the start of every exception).
Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a96ca8b1
...@@ -142,7 +142,12 @@ int default_idle(void) ...@@ -142,7 +142,12 @@ int default_idle(void)
while (!need_resched() && !cpu_is_offline(cpu)) { while (!need_resched() && !cpu_is_offline(cpu)) {
barrier(); barrier();
/*
* Go into low thread priority and possibly
* low power mode.
*/
HMT_low(); HMT_low();
HMT_very_low();
} }
HMT_medium(); HMT_medium();
...@@ -184,18 +189,18 @@ int dedicated_idle(void) ...@@ -184,18 +189,18 @@ int dedicated_idle(void)
start_snooze = __get_tb() + start_snooze = __get_tb() +
*smt_snooze_delay * tb_ticks_per_usec; *smt_snooze_delay * tb_ticks_per_usec;
while (!need_resched() && !cpu_is_offline(cpu)) { while (!need_resched() && !cpu_is_offline(cpu)) {
/* need_resched could be 1 or 0 at this /*
* point. If it is 0, set it to 0, so * Go into low thread priority and possibly
* an IPI/Prod is sent. If it is 1, keep * low power mode.
* it that way & schedule work.
*/ */
HMT_low();
HMT_very_low();
if (*smt_snooze_delay == 0 || if (*smt_snooze_delay == 0 ||
__get_tb() < start_snooze) { __get_tb() < start_snooze)
HMT_low(); /* Low thread priority */
continue; continue;
}
HMT_very_low(); /* Low power mode */ HMT_medium();
if (!(ppaca->lppaca.xIdle)) { if (!(ppaca->lppaca.xIdle)) {
/* Indicate we are no longer polling for /* Indicate we are no longer polling for
...@@ -210,7 +215,6 @@ int dedicated_idle(void) ...@@ -210,7 +215,6 @@ int dedicated_idle(void)
break; break;
} }
/* DRENG: Go HMT_medium here ? */
local_irq_disable(); local_irq_disable();
/* SMT dynamic mode. Cede will result /* SMT dynamic mode. Cede will result
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment