aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/cpu
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-09-26 17:11:39 +0200
committerJan Beulich <jbeulich@suse.com>2012-09-26 17:11:39 +0200
commit4394401748e2892710d641ec3e73a63aecf6d6d9 (patch)
treef358bb4de2657f0b00a17148f1e52b794f9a325d /xen/arch/x86/cpu
parent6fd5f43ad974e8759a9c7bb6c61987fc214f27cc (diff)
downloadxen-4394401748e2892710d641ec3e73a63aecf6d6d9.tar.gz
xen-4394401748e2892710d641ec3e73a63aecf6d6d9.tar.bz2
xen-4394401748e2892710d641ec3e73a63aecf6d6d9.zip
x86: default-disable MWAIT-based idle driver for CPUs without ARAT
Without ARAT, and apparently only when using HPET broadcast mode as replacement, CPUs occasionally fail to wake up, causing the system to (transiently) hang. Until the reason is understood, disable the driver on such systems. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/cpu')
-rw-r--r--xen/arch/x86/cpu/mwait-idle.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/xen/arch/x86/cpu/mwait-idle.c b/xen/arch/x86/cpu/mwait-idle.c
index 6a9ca95d33..e8b26e4ec8 100644
--- a/xen/arch/x86/cpu/mwait-idle.c
+++ b/xen/arch/x86/cpu/mwait-idle.c
@@ -71,7 +71,7 @@
# define pr_debug(fmt...)
#endif
-static __initdata bool_t no_mwait_idle;
+static __initdata s8 no_mwait_idle = -1;
invbool_param("mwait-idle", no_mwait_idle);
static unsigned int mwait_substates;
@@ -500,6 +500,13 @@ int __init mwait_idle_init(struct notifier_block *nfb)
if (pm_idle_save)
return -ENODEV;
+ /* XXX The no-ARAT case is supposedly being taken care of, but at
+ * least some systems without ARAT hang for some reason, apparently
+ * only when using HPET broadcast mode (PIT broadcast mode seems to
+ * be fine). */
+ if (no_mwait_idle < 0 && boot_cpu_has(X86_FEATURE_ARAT))
+ no_mwait_idle = 0;
+
err = mwait_idle_probe();
if (!err) {
if (!boot_cpu_has(X86_FEATURE_ARAT))