> I didn't measure skew across CPUs. I measured jitter between
> one local TSC
> and the chosen platform timer for calibration (in my case I
> think this was
> the HPET). I did this because getting a consistent tick rate from the
> platform timer, and from each local TSC, is the basis for the
> calibration
> algorithm. The more jitter there is between them, the less
> well it will
> work.
>
> I implemented a user-space program to collect the required
> stats. It used
> CLI/STI to prevent getting interrupted when reading the timer pair.
Hmmm... if the TSC is known to be stable*, is there any reason to
do the calibration vs the platform timer? If TSC is stable,
could we instead just do essentially a divide by cpu_ghz in
get_s_time() and be done, no periodic local_time_calibration()
necessary? Since TSC is stable on many newer platforms, it
would be nice to use this feature to decrease skew for guests
(both PV and HV).
* stable is the term used by Linux to mean that there's no
skew between the different TSC's in an SMP system
I gave this a try and it seems to work so far. (Fortunately,
my CPU is 3GHz so I just had to divide by 3... I'm not sure
how to divide by a non-integer.) Max skew for stime is holding
steady at 270nsec, >40x better than periodic calibration w/hpet.
If this sounds good, a design question: Should this be
controlled:
1) by a boot option, or
2) by the TSC_CONSTANT cpu flag, or
3) when determined dynamically to be safe using code similar
to arch/x86/tsc_sync.c in recent Linux kernels
(1) is by far the easiest (perhaps not too late for 3.3?)
while (3) is clearly the best for users but adds lots of
code (bloat/untested)
Thanks,
Dan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|