sh: sr.bl toggling around idle sleep.
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>
This commit is contained in:
parent
69d87daa18
commit
f3a9022fd1
1 changed files with 27 additions and 6 deletions
|
@ -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);
|
||||
|
@ -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;
|
||||
|
|
Reference in a new issue