Il 02/09/2014 21:57, Chris J Arges ha scritto: > Seconds get from host: 1409687073 > Seconds get from kvmclock: 1409333034 > Offset: -354039 > offset too large! > Check the stability of raw cycle ... > Worst warp -354462672821748 > Total vcpus: 2 > Test loops: 10000000 > Total warps: 1 > Total stalls: 0 > Worst warp: -354462672821748 > Raw cycle is not stable > Monotonic cycle test: > Worst warp -354455286691490 Looks like one CPU is not being initialized correctly: - The "next" correction in the trace is 18445647546048704244, and (next-2^64) / -354039 is about 3.1*10^9. This is a pretty plausible value of the TSC frequency. As a comparison, on my machine I have next=18446366988261784997 and an uptime of 29:12 hours, and the two match nicely with the CPU clock: -(18446366988261784997-2^64) / (29.2 * 3600 * 10^9) = 3.587 $ grep -m1 model.name /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E5-1620 0 @ 3.60GHz - The offset in seconds * 10^9 is pretty close to the warp in nanoseconds. Can you: 1) try this patch 2) gather a new trace 3) include uptime and cpuinfo in your report? All this without clocksource=hpet of course. Thanks, Paolo diff --git a/x86/kvmclock_test.c b/x86/kvmclock_test.c index 52a43fb..f68881c 100644 --- a/x86/kvmclock_test.c +++ b/x86/kvmclock_test.c @@ -7,6 +7,9 @@ #define DEFAULT_TEST_LOOPS 100000000L #define DEFAULT_THRESHOLD 5L +long threshold = DEFAULT_THRESHOLD; +int nerr = 0; + struct test_info { struct spinlock lock; long loops; /* test loops */ @@ -20,8 +23,9 @@ struct test_info { struct test_info ti[4]; -static int wallclock_test(long sec, long threshold) +static void wallclock_test(void *p_sec) { + long sec = *(long *)p_sec; long ksec, offset; struct timespec ts; @@ -36,10 +40,8 @@ static int wallclock_test(long sec, long threshold) if (offset > threshold || offset < -threshold) { printf("offset too large!\n"); - return 1; + nerr++; } - - return 0; } static void kvm_clock_test(void *data) @@ -116,10 +118,9 @@ static int cycle_test(int ncpus, long loops, int check, struct test_info *ti) int main(int ac, char **av) { int ncpus; - int nerr = 0, i; + int i; long loops = DEFAULT_TEST_LOOPS; long sec = 0; - long threshold = DEFAULT_THRESHOLD; if (ac > 1) loops = atol(av[1]); @@ -137,7 +138,8 @@ int main(int ac, char **av) on_cpu(i, kvm_clock_init, (void *)0); if (ac > 2) - nerr += wallclock_test(sec, threshold); + for (i = 0; i < ncpus; ++i) + on_cpu(i, wallclock_test, &sec); printf("Check the stability of raw cycle ...\n"); pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html