diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2008-06-24 05:58:53 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2008-07-16 17:27:05 -0400 |
commit | c1e3b377ad48febba6f91b8ae42c44ee4d4ab45e (patch) | |
tree | 7893e4226f52c4001150066f544415c1b17741f5 /arch | |
parent | 5b53496a5ad79e91052f72761a7c5516b069bc99 (diff) |
ACPI: Create "idle=halt" bootparam
"idle=halt" limits the idle loop to using
the halt instruction. No MWAIT, no IO accesses,
no C-states deeper than C1.
If something is broken in the idle code,
"idle=halt" is a less severe workaround
than "idle=poll" which disables all power savings.
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ia64/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/process.c | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index fabaf08d9a69..612b3c4a0603 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -55,6 +55,8 @@ void (*ia64_mark_idle)(int); | |||
55 | 55 | ||
56 | unsigned long boot_option_idle_override = 0; | 56 | unsigned long boot_option_idle_override = 0; |
57 | EXPORT_SYMBOL(boot_option_idle_override); | 57 | EXPORT_SYMBOL(boot_option_idle_override); |
58 | unsigned long idle_halt; | ||
59 | EXPORT_SYMBOL(idle_halt); | ||
58 | 60 | ||
59 | void | 61 | void |
60 | ia64_do_show_stack (struct unw_frame_info *info, void *arg) | 62 | ia64_do_show_stack (struct unw_frame_info *info, void *arg) |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 7dceea947232..7fc729498760 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -7,6 +7,10 @@ | |||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/pm.h> | 8 | #include <linux/pm.h> |
9 | #include <linux/clockchips.h> | 9 | #include <linux/clockchips.h> |
10 | #include <asm/system.h> | ||
11 | |||
12 | unsigned long idle_halt; | ||
13 | EXPORT_SYMBOL(idle_halt); | ||
10 | 14 | ||
11 | struct kmem_cache *task_xstate_cachep; | 15 | struct kmem_cache *task_xstate_cachep; |
12 | 16 | ||
@@ -325,7 +329,18 @@ static int __init idle_setup(char *str) | |||
325 | pm_idle = poll_idle; | 329 | pm_idle = poll_idle; |
326 | } else if (!strcmp(str, "mwait")) | 330 | } else if (!strcmp(str, "mwait")) |
327 | force_mwait = 1; | 331 | force_mwait = 1; |
328 | else | 332 | else if (!strcmp(str, "halt")) { |
333 | /* | ||
334 | * When the boot option of idle=halt is added, halt is | ||
335 | * forced to be used for CPU idle. In such case CPU C2/C3 | ||
336 | * won't be used again. | ||
337 | * To continue to load the CPU idle driver, don't touch | ||
338 | * the boot_option_idle_override. | ||
339 | */ | ||
340 | pm_idle = default_idle; | ||
341 | idle_halt = 1; | ||
342 | return 0; | ||
343 | } else | ||
329 | return -1; | 344 | return -1; |
330 | 345 | ||
331 | boot_option_idle_override = 1; | 346 | boot_option_idle_override = 1; |