]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-05-skip-tsc-clocksource
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.arch / x86-vmware-tsc-05-skip-tsc-clocksource
diff --git a/src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-05-skip-tsc-clocksource b/src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-05-skip-tsc-clocksource
new file mode 100644 (file)
index 0000000..96eda07
--- /dev/null
@@ -0,0 +1,135 @@
+From: Alok Kataria <akataria@vmware.com>
+Subject: x86: Skip verification by the watchdog for TSC clocksource.
+Patch-mainline:
+References: bnc#441338
+
+Impact: Changes timekeeping on Vmware (or with tsc=reliable).
+
+This is achieved by resetting the CLOCKSOURCE_MUST_VERIFY flag.
+
+We add a tsc=reliable commandline option to enable this.
+This enables legacy hardware without HPET, LAPIC, or ACPI timers
+to enter high-resolution timer mode.
+
+Along with that have extended this to be used in virtualization environement
+too. Now we also set this flag if the X86_FEATURE_TSC_RELIABLE bit is set.
+This is important since there is a wrap-around problem with the acpi_pm timer.
+The acpi_pm counter is just 24bits and this can overflow in ~4 seconds. With
+the NO_HZ kernels in virtualized environment, there can be situations when
+the guest is descheduled for longer duration, as a result we may miss the wrap
+of the acpi counter. When TSC is used as a clocksource and acpi_pm timer is
+being used as the watchdog clocksource this error in acpi_pm results in TSC
+being marked as unstable, and essentially results in time dropping in chunks
+of 4 seconds whenever this wrap is missed. Since the virtualized TSC is
+reliable on VMware, we should always use the TSCs clocksource on VMware, so
+we skip the verfication at runtime, by checking for the feature bit.
+
+Since we reset the flag for mgeode systems too, i have combined
+the mgeode case with the feature bit check.
+
+Signed-off-by: Jeff Hansen <jhansen@cardaccess-inc.com>
+Signed-off-by: Alok N Kataria <akataria@vmware.com>
+Signed-off-by: Dan Hecht <dhecht@vmware.com>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+
+ Documentation/kernel-parameters.txt |    7 +++++++
+ arch/x86/kernel/tsc.c               |   33 +++++++++++++++++++++------------
+ 2 files changed, 28 insertions(+), 12 deletions(-)
+
+
+--- a/arch/x86/kernel/tsc.c
++++ b/arch/x86/kernel/tsc.c
+@@ -32,6 +32,7 @@ static int tsc_unstable;
+    erroneous rdtsc usage on !cpu_has_tsc processors */
+ static int tsc_disabled = -1;
++static int tsc_clocksource_reliable;
+ /*
+  * Scheduler clock - returns current time in nanosec units.
+  */
+@@ -99,6 +100,15 @@ int __init notsc_setup(char *str)
+ __setup("notsc", notsc_setup);
++static int __init tsc_setup(char *str)
++{
++      if (!strcmp(str, "reliable"))
++              tsc_clocksource_reliable = 1;
++      return 1;
++}
++
++__setup("tsc=", tsc_setup);
++
+ #define MAX_RETRIES     5
+ #define SMI_TRESHOLD    50000
+@@ -564,24 +574,21 @@ static struct dmi_system_id __initdata b
+       {}
+ };
+-/*
+- * Geode_LX - the OLPC CPU has a possibly a very reliable TSC
+- */
++static void __init check_system_tsc_reliable(void)
++{
+ #ifdef CONFIG_MGEODE_LX
+-/* RTSC counts during suspend */
++      /* RTSC counts during suspend */
+ #define RTSC_SUSP 0x100
+-
+-static void __init check_geode_tsc_reliable(void)
+-{
+       unsigned long res_low, res_high;
+       rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
++      /* Geode_LX - the OLPC CPU has a possibly a very reliable TSC */
+       if (res_low & RTSC_SUSP)
+-              clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
+-}
+-#else
+-static inline void check_geode_tsc_reliable(void) { }
++              tsc_clocksource_reliable = 1;
+ #endif
++      if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
++              tsc_clocksource_reliable = 1;
++}
+ /*
+  * Make an educated guess if the TSC is trustworthy and synchronized
+@@ -616,6 +623,8 @@ static void __init init_tsc_clocksource(
+ {
+       clocksource_tsc.mult = clocksource_khz2mult(tsc_khz,
+                       clocksource_tsc.shift);
++      if (tsc_clocksource_reliable)
++              clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
+       /* lower the rating if we already know its unstable: */
+       if (check_tsc_unstable()) {
+               clocksource_tsc.rating = 0;
+@@ -676,7 +685,7 @@ void __init tsc_init(void)
+       if (unsynchronized_tsc())
+               mark_tsc_unstable("TSCs unsynchronized");
+-      check_geode_tsc_reliable();
++      check_system_tsc_reliable();
+       init_tsc_clocksource();
+ }
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -2200,6 +2200,13 @@ and is between 256 and 4096 characters. 
+                       Format:
+                       <io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
++      tsc=            Disable clocksource-must-verify flag for TSC.
++                      Format: <string>
++                      [x86] reliable: mark tsc clocksource as reliable, this
++                      disables clocksource verification at runtime.
++                      Used to enable high-resolution timer mode on older
++                      hardware, and in virtualized environment.
++
+       turbografx.map[2|3]=    [HW,JOY]
+                       TurboGraFX parallel port interface
+                       Format: