• Sean Christopherson's avatar
    KVM: lapic: Convert guest TSC to host time domain if necessary · b6aa57c6
    Sean Christopherson authored
    To minimize the latency of timer interrupts as observed by the guest,
    KVM adjusts the values it programs into the host timers to account for
    the host's overhead of programming and handling the timer event.  In
    the event that the adjustments are too aggressive, i.e. the timer fires
    earlier than the guest expects, KVM busy waits immediately prior to
    entering the guest.
    
    Currently, KVM manually converts the delay from nanoseconds to clock
    cycles.  But, the conversion is done in the guest's time domain, while
    the delay occurs in the host's time domain.  This is perfectly ok when
    the guest and host are using the same TSC ratio, but if the guest is
    using a different ratio then the delay may not be accurate and could
    wait too little or too long.
    
    When the guest is not using the host's ratio, convert the delay from
    guest clock cycles to host nanoseconds and use ndelay() instead of
    __delay() to provide more accurate timing.  Because converting to
    nanoseconds is relatively expensive, e.g. requires division and more
    multiplication ops, continue using __delay() directly when guest and
    host TSCs are running at the same ratio.
    
    Cc: Liran Alon <liran.alon@oracle.com>
    Cc: Wanpeng Li <wanpengli@tencent.com>
    Cc: stable@vger.kernel.org
    Fixes: 3b8a5df6 ("KVM: LAPIC: Tune lapic_timer_advance_ns automatically")
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    b6aa57c6
lapic.c 69.7 KB