Skip to content
  • Marcelo Tosatti's avatar
    KVM: x86: allow TSC to differ by NTP correction bounds without TSC scaling · 26769f96
    Marcelo Tosatti authored
    
    
    The Linux TSC calibration procedure is subject to small variations
    (its common to see +-1 kHz difference between reboots on a given CPU, for example).
    
    So migrating a guest between two hosts with identical processor can fail, in case
    of a small variation in calibrated TSC between them.
    
    Without TSC scaling, the current kernel interface will either return an error
    (if user_tsc_khz <= tsc_khz) or enable TSC catchup mode.
    
    This change enables the following TSC tolerance check to
    accept KVM_SET_TSC_KHZ within tsc_tolerance_ppm (which is 250ppm by default).
    
            /*
             * Compute the variation in TSC rate which is acceptable
             * within the range of tolerance and decide if the
             * rate being applied is within that bounds of the hardware
             * rate.  If so, no scaling or compensation need be done.
             */
            thresh_lo = adjust_tsc_khz(tsc_khz, -tsc_tolerance_ppm);
            thresh_hi = adjust_tsc_khz(tsc_khz, tsc_tolerance_ppm);
            if (user_tsc_khz < thresh_lo || user_tsc_khz > thresh_hi) {
                    pr_debug("kvm: requested TSC rate %u falls outside tolerance [%u,%u]\n", user_tsc_khz, thresh_lo, thresh_hi);
                    use_scaling = 1;
            }
    
    NTP daemon in the guest can correct this difference (NTP can correct upto 500ppm).
    
    Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    
    Message-Id: <20200616114741.GA298183@fuller.cnet>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    26769f96