Andrew Cooper
2013-Nov-05 15:13 UTC
[PATCH] x86/timing: Command line parameter to disable ARAT
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Keir Fraser <keir@xen.org>
CC: Jan Beulich <JBeulich@suse.com>
---
This has been split out of my HPET series (and hopefully for fasttract
committing) as it was only tangentially related in the first place, and has
been declared very useful.
---
docs/misc/xen-command-line.markdown | 9 +++++++++
xen/arch/x86/cpu/amd.c | 2 +-
xen/arch/x86/cpu/common.c | 3 +++
xen/arch/x86/cpu/cpu.h | 1 +
xen/arch/x86/cpu/intel.c | 5 +++--
5 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/docs/misc/xen-command-line.markdown
b/docs/misc/xen-command-line.markdown
index dc72473..15aa404 100644
--- a/docs/misc/xen-command-line.markdown
+++ b/docs/misc/xen-command-line.markdown
@@ -155,6 +155,15 @@ to boot on systems with the following errata:
Increase the verbosity of the APIC code from the default value.
+### arat
+> `= <boolean>`
+
+> Default: `true`
+
+Permit Xen to use "Always Running APIC Timer" support on compatible
hardware
+in combination with cpuidle. This option is only expected to be useful for
+developers wishing Xen to fall back to older timing methods on newer hardware.
+
### ats
> `= <boolean>`
diff --git a/xen/arch/x86/cpu/amd.c b/xen/arch/x86/cpu/amd.c
index 27b7f71..472df68 100644
--- a/xen/arch/x86/cpu/amd.c
+++ b/xen/arch/x86/cpu/amd.c
@@ -502,7 +502,7 @@ static void __devinit init_amd(struct cpuinfo_x86 *c)
* Family 0x12 and above processors have APIC timer
* running in deep C states.
*/
- if (c->x86 > 0x11)
+ if ( opt_arat && c->x86 > 0x11 )
set_bit(X86_FEATURE_ARAT, c->x86_capability);
/*
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index e1220e6..7e829b2 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -18,6 +18,9 @@
static bool_t __cpuinitdata use_xsave = 1;
boolean_param("xsave", use_xsave);
+bool_t __cpuinitdata opt_arat = 1;
+boolean_param("arat", opt_arat);
+
unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u;
integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
unsigned int __devinitdata opt_cpuid_mask_edx = ~0u;
diff --git a/xen/arch/x86/cpu/cpu.h b/xen/arch/x86/cpu/cpu.h
index 72c41ca..a7b7421 100644
--- a/xen/arch/x86/cpu/cpu.h
+++ b/xen/arch/x86/cpu/cpu.h
@@ -11,6 +11,7 @@ struct cpu_dev {
extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM];
+extern bool_t opt_arat;
extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
extern unsigned int opt_cpuid_mask_xsave_eax;
extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
diff --git a/xen/arch/x86/cpu/intel.c b/xen/arch/x86/cpu/intel.c
index 31b69c9..e855211 100644
--- a/xen/arch/x86/cpu/intel.c
+++ b/xen/arch/x86/cpu/intel.c
@@ -226,8 +226,9 @@ static void __devinit init_intel(struct cpuinfo_x86 *c)
set_bit(X86_FEATURE_NONSTOP_TSC, c->x86_capability);
set_bit(X86_FEATURE_TSC_RELIABLE, c->x86_capability);
}
- if ((c->cpuid_level >= 0x00000006) &&
- (cpuid_eax(0x00000006) & (1u<<2)))
+ if ( opt_arat &&
+ ( c->cpuid_level >= 0x00000006 ) &&
+ ( cpuid_eax(0x00000006) & (1u<<2) ) )
set_bit(X86_FEATURE_ARAT, c->x86_capability);
}
--
1.7.10.4