]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
x86/tsc: Remove incorrect assertion from cstate_restore_tsc()...
authorKeir Fraser <keir@xen.org>
Mon, 16 May 2011 12:37:28 +0000 (13:37 +0100)
committerKeir Fraser <keir@xen.org>
Mon, 16 May 2011 12:37:28 +0000 (13:37 +0100)
..fix and move to write_tsc().

Signed-off-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   23342:16d12acccacf
xen-unstable date:        Mon May 16 13:24:05 2011 +0100

xen/arch/x86/smpboot.c
xen/arch/x86/time.c
xen/include/asm-x86/msr.h

index 61cdc17259a54df0fd526fd842a9df0e1621bc5f..68e4eb53a48bb4186fe79d0de791cc919f99b7f5 100644 (file)
@@ -185,7 +185,12 @@ static void synchronize_tsc_slave(unsigned int slave)
         while ( atomic_read(&tsc_count) != ((i<<1)-1) )
             cpu_relax();
         rmb();
-        write_tsc(tsc_value);
+        /*
+         * If a CPU has been physically hotplugged, we may as well write
+         * to its TSC in spite of X86_FEATURE_TSC_RELIABLE. The platform does
+         * not sync up a new CPU's TSC for us.
+         */
+        __write_tsc(tsc_value);
         atomic_inc(&tsc_count);
     }
 }
index d4a5c617679481a51a265188db30b9430748783e..25035bcd2f75da558e9ad20cacea0e5d074df6fd 100644 (file)
@@ -683,8 +683,6 @@ void cstate_restore_tsc(void)
     if ( boot_cpu_has(X86_FEATURE_NONSTOP_TSC) )
         return;
 
-    ASSERT(boot_cpu_has(X86_FEATURE_TSC_RELIABLE));
-
     write_tsc(stime2tsc(read_platform_stime()));
 }
 
index 09fa28808102e39863bc7f3a5ece396f85102892..3b4132f8675614c60f17330821d05a8ebf8ea846 100644 (file)
@@ -87,7 +87,13 @@ static inline int wrmsr_safe(unsigned int msr, uint64_t val)
 } while(0)
 #endif
 
-#define write_tsc(val) wrmsrl(MSR_IA32_TSC, val)
+#define __write_tsc(val) wrmsrl(MSR_IA32_TSC, val)
+#define write_tsc(val) ({                                       \
+    /* Reliable TSCs are in lockstep across all CPUs. We should \
+     * never write to them. */                                  \
+    ASSERT(!boot_cpu_has(X86_FEATURE_TSC_RELIABLE));            \
+    __write_tsc(val);                                           \
+})
 
 #define write_rdtscp_aux(val) wrmsr(MSR_TSC_AUX, (val), 0)