System clock is slow

Bakul Shah bakul at
Tue Mar 10 17:52:38 UTC 2020

On Mar 10, 2020, at 9:24 AM, Theron <theron.tarigo at> wrote:
> On 2020-03-10 01:38, Peter Jeremy wrote:
>> Are you running NTP?  If so, is NTP maintaining lock and what is the
>> reported PLL frequency (ntpq -c kerni)?
> Didn't show any useful difference, "kernel status: pll unsync" when I tested this.

May take a while. ntpq -c peer should show a line with a leading *.
Though likely unrelated to your problem.

>> What does "sysctl kern.timecounter" report and have you tried using
>> any of the alternative timecounters listed in kern.timecounter.choice?
> Indeed that reveals the problem:
>     kern.timecounter.hardware: TSC-low
> (before regression)
> 1296053807
> (after regression)
> 1300000000

In an old (amd 8150) -12.1 machine I see
kern.timecounter.hardware: TSC-low 1806045908
machdep.tsc_freq: 3612091816

In a new ryzen -current machine:
kern.timecounter.hardware: TSC 2096123148
machdep.tsc_freq: 2096123148

> Through some printf's in tsc.c I've determined that the 2.6e9 value is from 0x16 CPUID which Intel says is only a nominal value not to be used, whereas 2.592e9 value is from calibration.
> /*
>  * Calculate TSC frequency using information from the CPUID leaf 0x15
>  * 'Time Stamp Counter and Nominal Core Crystal Clock'.  If leaf 0x15
>  * is not functional, as it is on Skylake/Kabylake, try 0x16 'Processor
>  * Frequency Information'.  Leaf 0x16 is described in the SDM as
>  * informational only, but if 0x15 did not work, and TSC calibration
>  * is disabled, it is the best we can get at all.  It should still be
>  * an improvement over the parsing of the CPU model name in
>  * tsc_freq_intel(), when available.
>  */
> The implementation logic for when to use tsc_freq_cpuid() looks wrong to me; it doesn't match what this comment implies.  Fallback to calibration when calibration is unspecified should proceed when 0x15 fails regardless of what 0x16 does.  (CC'd the authors).

As I understand it, if the user doesn't *explicitly* disable
frequency calibration, it must be calibrated. It may still be
skipped if there are no legacy devices. See around tsc.c:300.

What does sysctl machdep.disable_tsc_calibration return? Do you
see a line like the following in dmesg?

Skipping TSC calibration since no legacy devices reported by FADT and CPUID works

The Commit log says this:

    x86: Fall back to leaf 0x16 if TSC frequency is obtained by CPUID and
    leaf 0x15 is not functional.

    This should improve automatic TSC frequency determination on
    Skylake/Kabylake/... families, where 0x15 exists but does not provide
    all necessary information.  SDM contains relatively strong wording
    against such uses of 0x16, but Intel does not give us any other way to
    obtain the frequency. Linux did the same in the commit

    Based on submission by: Neel Chauhan <neel at>
    PR:     240475
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:

> Switching to HPET or ACPI-fast gives the expected results.  Would there be any reason to not use HPET provided I can cope with the performance implications?

Have you looked at hpet(4), timecounters(4), clocks(7) manpages?
I don't know how up-to-date these manpages are....

More information about the freebsd-current mailing list