• Anthoine Bourgeois's avatar
    KVM: x86: remove APIC Timer periodic/oneshot spikes · ecf08dad
    Anthoine Bourgeois authored
    Since the commit "8003c9ae: add APIC Timer periodic/oneshot mode VMX
    preemption timer support", a Windows 10 guest has some erratic timer
    spikes.
    
    Here the results on a 150000 times 1ms timer without any load:
    	  Before 8003c9ae | After 8003c9ae
    Max           1834us          |  86000us
    Mean          1100us          |   1021us
    Deviation       59us          |    149us
    Here the results on a 150000 times 1ms timer with a cpu-z stress test:
    	  Before 8003c9ae | After 8003c9ae
    Max          32000us          | 140000us
    Mean          1006us          |   1997us
    Deviation      140us          |  11095us
    
    The root cause of the problem is starting hrtimer with an expiry time
    already in the past can take more than 20 milliseconds to trigger the
    timer function.  It can be solved by forward such past timers
    immediately, rather than submitting them to hrtimer_start().
    In case the timer is periodic, update the target expiration and call
    hrtimer_start with it.
    
    v2: Check if the tsc deadline is already expired. Thank you Mika.
    v3: Execute the past timers immediately rather than submitting them to
    hrtimer_start().
    v4: Rearm the periodic timer with advance_periodic_target_expiration() a
    simpler version of set_target_expiration(). Thank you Paolo.
    
    Cc: Mika Penttilä <mika.penttila@nextfour.com>
    Cc: Wanpeng Li <kernellwp@gmail.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarAnthoine Bourgeois <anthoine.bourgeois@blade-group.com>
    8003c9ae ("KVM: LAPIC: add APIC Timer periodic/oneshot mode VMX preemption timer support")
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    ecf08dad
lapic.c 65.4 KB