From: Andi Kleen <ak@suse.de>
To: andreas.herrmann3@amd.com, mingo@elte.hu, tglx@linutronix.de,
linux-kernel@vger.kernel.org
Subject: [PATCH] [2/7] Use the correct cpuid method to detect MWAIT support for C states
Date: Wed, 16 Jan 2008 23:27:05 +0100 (CET) [thread overview]
Message-ID: <20080116222705.70BD014EE3@wotan.suse.de> (raw)
In-Reply-To: <200801161127.268350000@suse.de>
Previously there was a AMD specific quirk to handle the case of
AMD Fam10h MWAIT not supporting any C states. But it turns out
that CPUID already has ways to detectly detect that without
using special quirks.
The new code simply checks if MWAIT supports at least C1 and doesn't
use it if it doesn't. No more vendor specific code.
Note this is does not simply clear MWAIT because MWAIT can be still
useful even without C states.
Credit goes to Ben Serebrin for pointing out the (nearly) obvious.
Cc: "Andreas Herrmann" <andreas.herrmann3@amd.com>
Signed-off-by: Andi Kleen <ak@suse.de>
---
arch/x86/kernel/cpu/amd.c | 3 ---
arch/x86/kernel/process_32.c | 10 +++++++++-
arch/x86/kernel/process_64.c | 11 ++++++++++-
arch/x86/kernel/setup_64.c | 4 ----
4 files changed, 19 insertions(+), 9 deletions(-)
Index: linux/arch/x86/kernel/cpu/amd.c
===================================================================
--- linux.orig/arch/x86/kernel/cpu/amd.c
+++ linux/arch/x86/kernel/cpu/amd.c
@@ -300,9 +300,6 @@ static void __cpuinit init_amd(struct cp
local_apic_timer_disabled = 1;
#endif
- if (c->x86 == 0x10 && !force_mwait)
- clear_bit(X86_FEATURE_MWAIT, c->x86_capability);
-
/* K6s reports MCEs but don't actually have all the MSRs */
if (c->x86 < 6)
clear_bit(X86_FEATURE_MCE, c->x86_capability);
Index: linux/arch/x86/kernel/process_32.c
===================================================================
--- linux.orig/arch/x86/kernel/process_32.c
+++ linux/arch/x86/kernel/process_32.c
@@ -285,9 +285,17 @@ static void mwait_idle(void)
mwait_idle_with_hints(0, 0);
}
+static int mwait_usable(const struct cpuinfo_x86 *c)
+{
+ if (force_mwait)
+ return 1;
+ /* Any C1 states supported? */
+ return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0;
+}
+
void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
{
- if (cpu_has(c, X86_FEATURE_MWAIT)) {
+ if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
printk("monitor/mwait feature present.\n");
/*
* Skip, if setup has overridden idle.
Index: linux/arch/x86/kernel/process_64.c
===================================================================
--- linux.orig/arch/x86/kernel/process_64.c
+++ linux/arch/x86/kernel/process_64.c
@@ -280,10 +280,19 @@ static void mwait_idle(void)
}
}
+
+static int mwait_usable(const struct cpuinfo_x86 *c)
+{
+ if (force_mwait)
+ return 1;
+ /* Any C1 states supported? */
+ return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0;
+}
+
void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
{
static int printed;
- if (cpu_has(c, X86_FEATURE_MWAIT)) {
+ if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
/*
* Skip, if setup has overridden idle.
* One CPU supports mwait => All CPUs supports mwait
Index: linux/arch/x86/kernel/setup_64.c
===================================================================
--- linux.orig/arch/x86/kernel/setup_64.c
+++ linux/arch/x86/kernel/setup_64.c
@@ -778,10 +778,6 @@ static void __cpuinit init_amd(struct cp
/* MFENCE stops RDTSC speculation */
set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
- /* Family 10 doesn't support C states in MWAIT so don't use it */
- if (c->x86 == 0x10 && !force_mwait)
- clear_cpu_cap(c, X86_FEATURE_MWAIT);
-
if (amd_apic_timer_broken())
disable_apic_timer = 1;
}
next prev parent reply other threads:[~2008-01-16 22:32 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-16 22:27 [PATCH] [0/7] Some random x86 patches that should all go into git-x86 Andi Kleen
2008-01-16 22:27 ` [PATCH] [1/7] i386: Move MWAIT idle check to generic CPU initialization Andi Kleen
2008-01-16 22:27 ` Andi Kleen [this message]
2008-01-16 22:27 ` [PATCH] [3/7] Use shorter addresses in i386 segfault printks Andi Kleen
2008-01-17 2:58 ` Harvey Harrison
2008-01-17 3:11 ` H. Peter Anvin
2008-01-17 3:22 ` Harvey Harrison
2008-01-17 3:21 ` H. Peter Anvin
2008-01-17 11:27 ` Andi Kleen
2008-01-16 22:27 ` [PATCH] [4/7] Print which shared library/executable faulted in segfault etc. messages Andi Kleen
2008-01-16 22:27 ` [PATCH] [5/7] Replace hard coded reservations in x86-64 early boot code with dynamic table v2 Andi Kleen
2008-01-16 22:27 ` [PATCH] [6/7] Optimize lock prefix switching to run less frequently v2 Andi Kleen
2008-01-16 22:27 ` [PATCH] [7/7] Don't disable the APIC if it hasn't been mapped yet Andi Kleen
2008-01-18 9:43 ` [PATCH] [0/7] Some random x86 patches that should all go into git-x86 Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080116222705.70BD014EE3@wotan.suse.de \
--to=ak@suse.de \
--cc=andreas.herrmann3@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®