[PATCH 0/3] KVM: LAPIC: Optimize timer latency further

From: Wanpeng Li
Date: Thu May 09 2019 - 07:30:36 EST

Advance lapic timer tries to hidden the hypervisor overhead between host
timer fires and the guest awares the timer is fired. However, it just hidden
the time between apic_timer_fn/handle_preemption_timer -> wait_lapic_expire,
instead of the real position of vmentry which is mentioned in the orignial
commit d0659d946be0 ("KVM: x86: add option to advance tscdeadline hrtimer
expiration"). There is 700+ cpu cycles between the end of wait_lapic_expire
and before world switch on my haswell desktop, it will be 2400+ cycles if
vmentry_l1d_flush is tuned to always.

This patchset tries to narrow the last gap, it measures the time between
the end of wait_lapic_expire and before world switch, we take this
time into consideration when busy waiting, otherwise, the guest still
awares the latency between wait_lapic_expire and world switch, we also
consider this when adaptively tuning the timer advancement. The patch
can reduce 50% latency (~1600+ cycles to ~800+ cycles on a haswell
desktop) for kvm-unit-tests/tscdeadline_latency when testing busy waits.

Wanpeng Li (3):
KVM: LAPIC: Extract adaptive tune timer advancement logic
KVM: LAPIC: Fix lapic_timer_advance_ns parameter overflow
KVM: LAPIC: Optimize timer latency further

arch/x86/kvm/lapic.c | 78 ++++++++++++++++++++++++++++++++++----------------
arch/x86/kvm/lapic.h | 8 ++++++
arch/x86/kvm/vmx/vmx.c | 2 ++
arch/x86/kvm/x86.c | 2 +-
4 files changed, 64 insertions(+), 26 deletions(-)