On Tue, May 08, 2018 at 08:17:14AM +0000, Anthoine Bourgeois wrote: > commit ecf08dad723d3e000aecff6c396f54772d124733 upstream. > > Since the commit "8003c9ae204e: 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 8003c9ae204e | After 8003c9ae204e > 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 8003c9ae204e | After 8003c9ae204e > 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@xxxxxxxxxxxx> > Cc: Wanpeng Li <kernellwp@xxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # 4.14.x > Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois@xxxxxxxxxxxxxxx> > 8003c9ae204e ("KVM: LAPIC: add APIC Timer periodic/oneshot mode VMX preemption timer support") > Signed-off-by: Radim Krčmář <rkrcmar@xxxxxxxxxx> > --- > arch/x86/kvm/lapic.c | 37 ++++++++++++++++++++----------------- > 1 file changed, 20 insertions(+), 17 deletions(-) Now applied, thanks. greg k-h