Jeremy, Jan - what do you think? Is this a bad move? I feel like there
is a consequence to this that I am unaware of, but it fixes my issue.
--
x86: unconditionally mark TSC unstable under Xen
In certain domU environments (new Intel), time will rewind and jump
around by seconds or more, leading to inaccurate measurements
kernel-wide. This patch unilaterally marks the TSC unstable under Xen,
which prevents timing from jumping around on these processors without
significant penalty in all domU environments.
An example of this is the following testcase which runs many shell
processes, each of which does a DNS lookup with dig(1):
http://gist.github.com/449825
When run on a Debian testing x86_64 system without this change it
gives:
$ (cd /tmp;git clone git://gist.github.com/449825.git;cd 449825;git
pull;time perl many-digs.pl)
[...]
real 0m7.063s
user 268659840m0.951s
sys 38524003m13.072s
And with it:
real 0m6.468s
user 0m2.851s
sys 0m6.789s
The issue isn't particular to that bit of code, it'll also crop when
running the Git test suite in parallel, or in the TIME+ top(1)
reports. Which will eventually end up displaying times like
"-596523h-14:-8" for most long-lived processes on the system.
This closes bug #16314 - Erroneous idle times for processes:
https://bugzilla.kernel.org/show_bug.cgi?id=16314
It was also reported on the Linode forums as "Xen timing wonkyness":
http://www.linode.com/forums/viewtopic.php?t=5731
Signed-off-by: Jed Smith <jed@xxxxxxxxxx>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
Reported-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
Tested-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
---
arch/x86/kernel/cpu/intel.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 85f69cd..afc839a 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -90,8 +90,14 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
if (c->x86_power & (1 << 8)) {
set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC);
+#ifndef CONFIG_XEN
if (!check_tsc_unstable())
sched_clock_stable = 1;
+#else
+ /*
+ * Under Xen, we cannot consider the TSC stable or it will
+ * go backwards in certain circumstances. Bug 16314.
+ */
+ mark_tsc_unstable("Xen domain");
+#endif
}
/*
--
1.6.0.4
Regards,
Jed Smith
Systems Administrator
Linode, LLC
+1 (609) 593-7103 x1209
jed@xxxxxxxxxx
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|