Port-amd64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
TSC vs. HPET timecounter priority
NetBSD has a problem with NTP time keeping on x86 systems which have TSC: if
those systems have variable CPU clock frequency support for power consumption
efficiency (e.g. SpeedStep, PowerNow), if or when the CPU frequency changes,
the relationship between TSC and the ticking of real time changes. That screws
up any kind of interval time & frequency measurement one is using TSC for.
The High Precision Event Timer (HPET) is intended to provide timekeeping
independent of CPU clock frequency, and do a better job than the old 8254 timer
chip one finds on ISA bus.
Right now, our kernel timecounter code takes the TSC over the HPET if both are
present; it's a static "quality" value in a table structure. The result on
systems with variable CPU frequency is poorer timekeeping. This can be measured
if you're running ntpd; see the output of ntptime(1) and look for "frequency" -
that number wants to be as close to zero as possible (it can be negative or
positive). It's calculated over a long time baseline (hours of NTP
query/response samples from your (hopefully carefully selected) NTP peers) and
saved in /var/db/ntp.drift for persistence between reboots so it doesn't have
to be recalculated from scratch every time ntpd is restarted. You should see
this value change if you change the kern.timecounter.hardware sysctl setting in
your system to one of the other sources, and wait, say, six hours or more
(overnight ought to do it).
A quick google of NetBSD's mail archives shows a discussion of this issue in
2009 on port-amd64, but apparently no code changes came about. An alternative
implementation of a putatively more accurate timer device (the L-APIC) also
independent of CPU clock frequency was suggested, but I don't see code for
that, either.
Until something is written and committed, I suggest an easy change in
timecounter "quality" for HPET to make it preferred to TSC if both are present.
Another way to handle the issue is for the TSC timecounter attachment code to
also check for the CPU clock frequency variability features of the various
CPUs, and adjust the TSC quality down (perhaps to zero?) if they are present.
I delve into x86 code as little as possible, but I've been in the guts of this
stuff before, to deal with a mis-ordering of TSC attachment that I found when I
was playing with an AMD Geode system some years ago, though that was before the
timecounter code came in. I'm willing to get into it again if no one else wants
to touch this, but I'd prefer a developer who is more temporally familiar with
it to tackle it.
I believe we should deal with this before 6.0 ships.
Erik <fair%netbsd.org@localhost>
Home |
Main Index |
Thread Index |
Old Index