| From 6c56ccecf05fafe100ab4ea94f6fccbf5ff00db7 Mon Sep 17 00:00:00 2001 |
| From: Pallipadi, Venkatesh <venkatesh.pallipadi@intel.com> |
| Date: Thu, 17 Dec 2009 12:27:02 -0800 |
| Subject: x86: Reenable TSC sync check at boot, even with NONSTOP_TSC |
| |
| From: Pallipadi, Venkatesh <venkatesh.pallipadi@intel.com> |
| |
| commit 6c56ccecf05fafe100ab4ea94f6fccbf5ff00db7 upstream. |
| |
| Commit 83ce4009 did the following change |
| If the TSC is constant and non-stop, also set it reliable. |
| |
| But, there seems to be few systems that will end up with TSC warp across |
| sockets, depending on how the cpus come out of reset. Skipping TSC sync |
| test on such systems may result in time inconsistency later. |
| |
| So, reenable TSC sync test even on constant and non-stop TSC systems. |
| Set, sched_clock_stable to 1 by default and reset it in |
| mark_tsc_unstable, if TSC sync fails. |
| |
| This change still gives perf benefit mentioned in 83ce4009 for systems |
| where TSC is reliable. |
| |
| Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> |
| LKML-Reference: <20091217202702.GA18015@linux-os.sc.intel.com> |
| Signed-off-by: H. Peter Anvin <hpa@zytor.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/kernel/cpu/intel.c | 1 - |
| arch/x86/kernel/tsc.c | 1 + |
| 2 files changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/cpu/intel.c |
| +++ b/arch/x86/kernel/cpu/intel.c |
| @@ -70,7 +70,6 @@ static void __cpuinit early_init_intel(s |
| if (c->x86_power & (1 << 8)) { |
| set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
| set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
| - set_cpu_cap(c, X86_FEATURE_TSC_RELIABLE); |
| sched_clock_stable = 1; |
| } |
| |
| --- a/arch/x86/kernel/tsc.c |
| +++ b/arch/x86/kernel/tsc.c |
| @@ -763,6 +763,7 @@ void mark_tsc_unstable(char *reason) |
| { |
| if (!tsc_unstable) { |
| tsc_unstable = 1; |
| + sched_clock_stable = 0; |
| printk(KERN_INFO "Marking TSC unstable due to %s\n", reason); |
| /* Change only the rating, when not registered */ |
| if (clocksource_tsc.mult) |