KVM: x86: support using the vmx preemption timer for tsc deadline timer 61/17061/1
authorYunhong Jiang <yunhong.jiang@gmail.com>
Mon, 13 Jun 2016 21:20:01 +0000 (14:20 -0700)
committerYunhong Jiang <yunhong.jiang@linux.intel.com>
Mon, 18 Jul 2016 15:06:50 +0000 (08:06 -0700)
commitebcdab040619575a47ad19b18e7ed5c38d287336
treed806a3a9443fcf29245e37aa0efc5f4a4de5230c
parentab9c81f473b3feff08f1e51428fbaf6a93d4896a
KVM: x86: support using the vmx preemption timer for tsc deadline timer

The VMX preemption timer can be used to virtualize the TSC deadline timer.
The VMX preemption timer is armed when the vCPU is running, and a VMExit
will happen if the virtual TSC deadline timer expires.

When the vCPU thread is blocked because of HLT, KVM will switch to use
an hrtimer, and then go back to the VMX preemption timer when the vCPU
thread is unblocked.

This solution avoids the complex OS's hrtimer system, and the host
timer interrupt handling cost, replacing them with a little math
(for guest->host TSC and host TSC->preemption timer conversion)
and a cheaper VMexit.  This benefits latency for isolated pCPUs.

[A word about performance... Yunhong reported a 30% reduction in average
 latency from cyclictest.  I made a similar test with tscdeadline_latency
 from kvm-unit-tests, and measured

 - ~20 clock cycles loss (out of ~3200, so less than 1% but still
   statistically significant) in the worst case where the test halts
   just after programming the TSC deadline timer

 - ~800 clock cycles gain (25% reduction in latency) in the best case
   where the test busy waits.

 I removed the VMX bits from Yunhong's patch, to concentrate them in the
 next patch - Paolo]

Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Change-Id: I4aa1ecfa3463d1cbfb317511b45d2074b33d9b6f
upstream-status: backport
Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com>
kernel/arch/x86/include/asm/kvm_host.h
kernel/arch/x86/kvm/lapic.c
kernel/arch/x86/kvm/lapic.h
kernel/arch/x86/kvm/trace.h
kernel/arch/x86/kvm/x86.c