Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1226072 > unrolled thread

[PATCH] Fix Geode LX timekeeping in generic build

Started byDavid Woodhouse <dwmw2@infradead.org>
First post2015-09-16 15:20 +0200
Last post2015-09-16 16:10 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] Fix Geode LX timekeeping in generic build David Woodhouse <dwmw2@infradead.org> - 2015-09-16 15:20 +0200
    [tip:x86/urgent] x86/platform:   Fix Geode LX timekeeping in the generic x86 build tip-bot for David Woodhouse <tipbot@zytor.com> - 2015-09-16 16:10 +0200

#1226072 — [PATCH] Fix Geode LX timekeeping in generic build

FromDavid Woodhouse <dwmw2@infradead.org>
Date2015-09-16 15:20 +0200
Subject[PATCH] Fix Geode LX timekeeping in generic build
Message-ID<q9kMW-5w2-21@gated-at.bofh.it>

[Multipart message — attachments visible in raw view] — view raw

In 2007, commit 07190a08eef36 ("Mark TSC on GeodeLX reliable") bypassed
verification of the TSC on Geode LX. However, this code (now in the
check_system_tsc_reliable() function in arch/x86/kernel/tsc.c) was only
present if CONFIG_MGEODE_LX was set. 

OpenWRT has recently started building its generic Geode target for
Geode GX, not LX, to include support for additional platforms. This
broke the timekeeping on LX-based devices, because the TSC wasn't
marked as reliable: https://dev.openwrt.org/ticket/20531

By adding a runtime check on is_geode_lx(), we can also include the fix
if CONFIG_MGEODEGX1 or CONFIG_X86_GENERIC are set, thus fixing the
problem.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Cc: stable@vger.kernel.org
---
I'm slightly concerned about bypassing verification though, when the
reason I *noticed* this issue is because the verification *failed*:

[    8.893307] xt_time: kernel timezone is -0000                                
[   14.522754] clocksource: timekeeping watchdog: Marking clocksource 'tsc' as unstable because the skew is too large:                                          
[   14.555090] clocksource:                       'pit' wd_now: eba5b2f7 wd_last: eb9ca2c8 mask: ffffffff                                                       
[   14.564406] clocksource:                       'tsc' cs_now: 29eb8ba17 cs_last: 28c61a5f6 mask: ffffffffffffffff                                             
[   14.598508] clocksource: Switched to clocksource pit  

If the bypass is supposed to be just an optimisation, surely this means
there's something else wrong? Or that bypassing the validation wasn't
the right thing to do in the first place?

FWIW the clock *does* run correctly if using the TSC, after applying
this patch. If I let it fall back to the PIT, it gains time wildly.

diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 7437b41..dc9af7a 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -21,6 +21,7 @@
 #include <asm/hypervisor.h>
 #include <asm/nmi.h>
 #include <asm/x86_init.h>
+#include <asm/geode.h>
 
 unsigned int __read_mostly cpu_khz;	/* TSC clocks / usec, not used here */
 EXPORT_SYMBOL(cpu_khz);
@@ -1013,15 +1014,17 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
 static void __init check_system_tsc_reliable(void)
 {
-#ifdef CONFIG_MGEODE_LX
-	/* RTSC counts during suspend */
+#if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC)
+	if (is_geode_lx()) {
+		/* RTSC counts during suspend */
 #define RTSC_SUSP 0x100
-	unsigned long res_low, res_high;
+		unsigned long res_low, res_high;
 
-	rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
-	/* Geode_LX - the OLPC CPU has a very reliable TSC */
-	if (res_low & RTSC_SUSP)
-		tsc_clocksource_reliable = 1;
+		rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
+		/* Geode_LX - the OLPC CPU has a very reliable TSC */
+		if (res_low & RTSC_SUSP)
+			tsc_clocksource_reliable = 1;
+	}
 #endif
 	if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
 		tsc_clocksource_reliable = 1;



-- 
David Woodhouse                            Open Source Technology Centre
David.Woodhouse@intel.com                              Intel Corporation

[toc] | [next] | [standalone]


#1226115 — [tip:x86/urgent] x86/platform: Fix Geode LX timekeeping in the generic x86 build

Fromtip-bot for David Woodhouse <tipbot@zytor.com>
Date2015-09-16 16:10 +0200
Subject[tip:x86/urgent] x86/platform: Fix Geode LX timekeeping in the generic x86 build
Message-ID<q9lzk-6Gb-19@gated-at.bofh.it>
In reply to#1226072
Commit-ID:  03da3ff1cfcd7774c8780d2547ba0d995f7dc03d
Gitweb:     http://git.kernel.org/tip/03da3ff1cfcd7774c8780d2547ba0d995f7dc03d
Author:     David Woodhouse <dwmw2@infradead.org>
AuthorDate: Wed, 16 Sep 2015 14:10:03 +0100
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 16 Sep 2015 16:00:12 +0200

x86/platform: Fix Geode LX timekeeping in the generic x86 build

In 2007, commit 07190a08eef36 ("Mark TSC on GeodeLX reliable")
bypassed verification of the TSC on Geode LX. However, this code
(now in the check_system_tsc_reliable() function in
arch/x86/kernel/tsc.c) was only present if CONFIG_MGEODE_LX was
set.

OpenWRT has recently started building its generic Geode target
for Geode GX, not LX, to include support for additional
platforms. This broke the timekeeping on LX-based devices,
because the TSC wasn't marked as reliable:
https://dev.openwrt.org/ticket/20531

By adding a runtime check on is_geode_lx(), we can also include
the fix if CONFIG_MGEODEGX1 or CONFIG_X86_GENERIC are set, thus
fixing the problem.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Cc: Andres Salomon <dilinger@queued.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Marcelo Tosatti <marcelo@kvack.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1442409003.131189.87.camel@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/tsc.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 79055cf..51e62d6 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -21,6 +21,7 @@
 #include <asm/hypervisor.h>
 #include <asm/nmi.h>
 #include <asm/x86_init.h>
+#include <asm/geode.h>
 
 unsigned int __read_mostly cpu_khz;	/* TSC clocks / usec, not used here */
 EXPORT_SYMBOL(cpu_khz);
@@ -1015,15 +1016,17 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
 static void __init check_system_tsc_reliable(void)
 {
-#ifdef CONFIG_MGEODE_LX
-	/* RTSC counts during suspend */
+#if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC)
+	if (is_geode_lx()) {
+		/* RTSC counts during suspend */
 #define RTSC_SUSP 0x100
-	unsigned long res_low, res_high;
+		unsigned long res_low, res_high;
 
-	rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
-	/* Geode_LX - the OLPC CPU has a very reliable TSC */
-	if (res_low & RTSC_SUSP)
-		tsc_clocksource_reliable = 1;
+		rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
+		/* Geode_LX - the OLPC CPU has a very reliable TSC */
+		if (res_low & RTSC_SUSP)
+			tsc_clocksource_reliable = 1;
+	}
 #endif
 	if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
 		tsc_clocksource_reliable = 1;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web