[PATCH RFC 0/7] kvm pvtimer
From: Quan Xu
Date: Fri Dec 08 2017 - 03:40:24 EST
From: Ben Luo <bn0418@xxxxxxxxx>
This patchset introduces a new paravirtualized mechanism to reduce VM-exit
caused by guest timer accessing.
In general, KVM guest programs tsc-deadline timestamp to MSR_IA32_TSC_DEADLINE
MSR. This will cause a VM-exit, and then KVM handles this timer for guest.
Also kvm always registers timer on the CPU which vCPU was running on. Even
though vCPU thread is rescheduled to another CPU, the timer will be migrated
to the target CPU as well. When timer expired, timer interrupt could make
guest-mode vCPU VM-exit on this CPU.
When pvtimer is enabled:
- The tsc-deadline timestamp is mostly recorded in share page with less
VM-exit. We Introduce a periodically working kthread to scan share page
and synchronize timer setting for guest on a dedicated CPU.
- Since the working kthread scans periodically, some of the timer events
may be lost or delayed. We have to program these tsc-deadline timestamps
to MSR_IA32_TSC_DEADLINE as normal, which will cause VM-exit and KVM will
signal the working thread through IPI to program timer, instread of
registering on current CPU.
- Timer interrupt will be delivered by posted interrupt mechanism to vCPUs
with less VM-exit.
Ben Luo (7):
kvm: x86: emulate MSR_KVM_PV_TIMER_EN MSR
kvm: x86: add a function to exchange value
KVM: timer: synchronize tsc-deadline timestamp for guest
KVM: timer: program timer to a dedicated CPU
KVM: timer: ignore timer migration if pvtimer is enabled
Doc/KVM: introduce a new cpuid bit for kvm pvtimer
kvm: guest: reprogram guest timer
Documentation/virtual/kvm/cpuid.txt | 4 +
arch/x86/include/asm/kvm_host.h | 5 +
arch/x86/include/asm/kvm_para.h | 9 ++
arch/x86/include/uapi/asm/kvm_para.h | 7 ++
arch/x86/kernel/apic/apic.c | 9 +-
arch/x86/kernel/kvm.c | 38 ++++++++
arch/x86/kvm/cpuid.c | 1 +
arch/x86/kvm/lapic.c | 170 +++++++++++++++++++++++++++++++++-
arch/x86/kvm/lapic.h | 11 ++
arch/x86/kvm/x86.c | 15 +++-
include/linux/kvm_host.h | 3 +
virt/kvm/kvm_main.c | 42 +++++++++
12 files changed, 308 insertions(+), 6 deletions(-)