Skip to content
  • David Vrabel's avatar
    x86/kvm: fix LAPIC timer drift when guest uses periodic mode · d8f2f498
    David Vrabel authored
    Since 4.10, commit 8003c9ae (KVM: LAPIC: add APIC Timer
    periodic/oneshot mode VMX preemption timer support), guests using
    periodic LAPIC timers (such as FreeBSD 8.4) would see their timers
    drift significantly over time.
    
    Differences in the underlying clocks and numerical errors means the
    periods of the two timers (hv and sw) are not the same. This
    difference will accumulate with every expiry resulting in a large
    error between the hv and sw timer.
    
    This means the sw timer may be running slow when compared to the hv
    timer. When the timer is switched from hv to sw, the now active sw
    timer will expire late. The guest VCPU is reentered and it switches to
    using the hv timer. This timer catches up, injecting multiple IRQs
    into the guest (of which the guest only sees one as it does not get to
    run until the hv timer has caught up) and thus the guest's timer rate
    is low (and becomes increasing slower over time as the sw timer lags
    further and further behind).
    
    I believe a similar problem would occur if the hv timer is the slower
    one, but I have not observed this.
    
    Fix this by synchronizing the deadlines for both timers to the same
    time source on every tick. This prevents the errors from accumulating.
    
    Fixes: 8003c9ae
    
    
    Cc: Wanpeng Li <wanpeng.li@hotmail.com>
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@nutanix.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarWanpeng Li <wanpengli@tencent.com>
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    d8f2f498