diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-22 17:26:18 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-22 17:26:18 -0700 |
commit | cdb7532f7be35c3675b1aed54d10e378014618b6 (patch) | |
tree | 925df597b70c4a1de629fec68f9e4ebd3fd9e803 /arch/sh/kernel/process.c | |
parent | 7992018d979460af59fbae8a48f9641305aea438 (diff) | |
parent | 31d106c68b1af88835a474556052d6efbfec99c5 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6:
sh: Fix dreamcast build for IRQ changes.
sh: Fix clock multiplier on SH7722.
sh: Wire up kdump crash kernel exec in die().
sh: sr.bl toggling around idle sleep.
sh: disable genrtc support.
fs: Kill sh dependency for binfmt_flat.
sh: Disable psw support for R7785RP.
sh: Fix page size alignment in __copy_user_page().
sh: Fix up various compile warnings for SE boards.
sh: Wire up signalfd/timerfd/eventfd syscalls.
sh: revert addition of page fault notifiers
spelling fixes: arch/sh/
input: hp680_ts compile fixes.
sh: landisk: Header cleanups.
sh: landisk: rtc-rs5c313 support.
sh: Kill off pmb slab cache destructor.
sh: Fix up psw build rules for r7780rp.
sh: Shut up compiler warnings in __do_page_fault().
Diffstat (limited to 'arch/sh/kernel/process.c')
-rw-r--r-- | arch/sh/kernel/process.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 6b4f5748d0b..a11e2aa73cb 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c @@ -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; |