Skip to content

Commit

Permalink
sh: sr.bl toggling around idle sleep.
Browse files Browse the repository at this point in the history
As pointed out by Saito-san, without the sr.bl manipulation we can
occasionally hit delays in the idle loop due to interrupt handling, so
ensure that interrupts are blocked before going to sleep.

At the same time, we throw in TIF_POLLING_NRFLAG for the !hlt_counter
case (primarily used by the ST-40 parts).

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed May 21, 2007
1 parent 69d87da commit f3a9022
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions arch/sh/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
static int hlt_counter;
int ubc_usercnt = 0;

#define HARD_IDLE_TIMEOUT (HZ / 3)

void (*pm_idle)(void);
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
Expand All @@ -44,16 +42,39 @@ void enable_hlt(void)
}
EXPORT_SYMBOL(enable_hlt);

static int __init nohlt_setup(char *__unused)
{
hlt_counter = 1;
return 1;
}
__setup("nohlt", nohlt_setup);

static int __init hlt_setup(char *__unused)
{
hlt_counter = 0;
return 1;
}
__setup("hlt", hlt_setup);

void default_idle(void)
{
if (!hlt_counter)
cpu_sleep();
else
cpu_relax();
if (!hlt_counter) {
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb__after_clear_bit();
set_bl_bit();
while (!need_resched())
cpu_sleep();
clear_bl_bit();
set_thread_flag(TIF_POLLING_NRFLAG);
} else
while (!need_resched())
cpu_relax();
}

void cpu_idle(void)
{
set_thread_flag(TIF_POLLING_NRFLAG);

/* endless idle loop with no priority at all */
while (1) {
void (*idle)(void) = pm_idle;
Expand Down

0 comments on commit f3a9022

Please sign in to comment.