diff options
author | Andi Kleen <ak@suse.de> | 2007-05-02 13:27:12 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:12 -0400 |
commit | f039b754714a422959027cb18bb33760eb8153f0 (patch) | |
tree | c5f28502adf35f5ea7738a974cd7c4fc81e1dd21 /arch/i386 | |
parent | c169859d6dfc7471ef9f2dbd720936e17906a084 (diff) |
[PATCH] x86: Don't use MWAIT on AMD Family 10
It doesn't put the CPU into deeper sleep states, so it's better to use the standard
idle loop to save power. But allow to reenable it anyways for benchmarking.
I also removed the obsolete idle=halt on i386
Cc: andreas.herrmann@amd.com
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/cpu/amd.c | 5 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 17 |
2 files changed, 13 insertions, 9 deletions
diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c index 2d47db482972..197cda62caa3 100644 --- a/arch/i386/kernel/cpu/amd.c +++ b/arch/i386/kernel/cpu/amd.c | |||
@@ -53,6 +53,8 @@ static __cpuinit int amd_apic_timer_broken(void) | |||
53 | return 0; | 53 | return 0; |
54 | } | 54 | } |
55 | 55 | ||
56 | int force_mwait __cpuinitdata; | ||
57 | |||
56 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) | 58 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) |
57 | { | 59 | { |
58 | u32 l, h; | 60 | u32 l, h; |
@@ -275,6 +277,9 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
275 | 277 | ||
276 | if (amd_apic_timer_broken()) | 278 | if (amd_apic_timer_broken()) |
277 | set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability); | 279 | set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability); |
280 | |||
281 | if (c->x86 == 0x10 && !force_mwait) | ||
282 | clear_bit(X86_FEATURE_MWAIT, c->x86_capability); | ||
278 | } | 283 | } |
279 | 284 | ||
280 | static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size) | 285 | static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size) |
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 393a67d5d943..7e8e129b3d7d 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -272,25 +272,24 @@ void __devinit select_idle_routine(const struct cpuinfo_x86 *c) | |||
272 | } | 272 | } |
273 | } | 273 | } |
274 | 274 | ||
275 | static int __init idle_setup (char *str) | 275 | static int __init idle_setup(char *str) |
276 | { | 276 | { |
277 | if (!strncmp(str, "poll", 4)) { | 277 | if (!strcmp(str, "poll")) { |
278 | printk("using polling idle threads.\n"); | 278 | printk("using polling idle threads.\n"); |
279 | pm_idle = poll_idle; | 279 | pm_idle = poll_idle; |
280 | #ifdef CONFIG_X86_SMP | 280 | #ifdef CONFIG_X86_SMP |
281 | if (smp_num_siblings > 1) | 281 | if (smp_num_siblings > 1) |
282 | printk("WARNING: polling idle and HT enabled, performance may degrade.\n"); | 282 | printk("WARNING: polling idle and HT enabled, performance may degrade.\n"); |
283 | #endif | 283 | #endif |
284 | } else if (!strncmp(str, "halt", 4)) { | 284 | } else if (!strcmp(str, "mwait")) |
285 | printk("using halt in idle threads.\n"); | 285 | force_mwait = 1; |
286 | pm_idle = default_idle; | 286 | else |
287 | } | 287 | return -1; |
288 | 288 | ||
289 | boot_option_idle_override = 1; | 289 | boot_option_idle_override = 1; |
290 | return 1; | 290 | return 0; |
291 | } | 291 | } |
292 | 292 | early_param("idle", idle_setup); | |
293 | __setup("idle=", idle_setup); | ||
294 | 293 | ||
295 | void show_regs(struct pt_regs * regs) | 294 | void show_regs(struct pt_regs * regs) |
296 | { | 295 | { |