linux_dsm_epyc7002/arch/x86/kvm
Paolo Bonzini b95234c840 kvm: x86: do not use KVM_REQ_EVENT for APICv interrupt injection
Since bf9f6ac8d7 ("KVM: Update Posted-Interrupts Descriptor when vCPU
is blocked", 2015-09-18) the posted interrupt descriptor is checked
unconditionally for PIR.ON.  Therefore we don't need KVM_REQ_EVENT to
trigger the scan and, if NMIs or SMIs are not involved, we can avoid
the complicated event injection path.

Calling kvm_vcpu_kick if PIR.ON=1 is also useless, though it has been
there since APICv was introduced.

However, without the KVM_REQ_EVENT safety net KVM needs to be much
more careful about races between vmx_deliver_posted_interrupt and
vcpu_enter_guest.  First, the IPI for posted interrupts may be issued
between setting vcpu->mode = IN_GUEST_MODE and disabling interrupts.
If that happens, kvm_trigger_posted_interrupt returns true, but
smp_kvm_posted_intr_ipi doesn't do anything about it.  The guest is
entered with PIR.ON, but the posted interrupt IPI has not been sent
and the interrupt is only delivered to the guest on the next vmentry
(if any).  To fix this, disable interrupts before setting vcpu->mode.
This ensures that the IPI is delayed until the guest enters non-root mode;
it is then trapped by the processor causing the interrupt to be injected.

Second, the IPI may be issued between kvm_x86_ops->sync_pir_to_irr(vcpu)
and vcpu->mode = IN_GUEST_MODE.  In this case, kvm_vcpu_kick is called
but it (correctly) doesn't do anything because it sees vcpu->mode ==
OUTSIDE_GUEST_MODE.  Again, the guest is entered with PIR.ON but no
posted interrupt IPI is pending; this time, the fix for this is to move
the RVI update after IN_GUEST_MODE.

Both issues were mostly masked by the liberal usage of KVM_REQ_EVENT,
though the second could actually happen with VT-d posted interrupts.
In both race scenarios KVM_REQ_EVENT would cancel guest entry, resulting
in another vmentry which would inject the interrupt.

This saves about 300 cycles on the self_ipi_* tests of vmexit.flat.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-02-15 14:54:36 +01:00
..
assigned-dev.c
assigned-dev.h
cpuid.c Revert "KVM: nested VMX: disable perf cpuid reporting" 2017-01-20 22:18:55 +01:00
cpuid.h
debugfs.c
emulate.c Merge branch 'x86/cpufeature' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next 2017-01-17 17:53:01 +01:00
hyperv.c
hyperv.h
i8254.c
i8254.h
i8259.c
ioapic.c
ioapic.h
iommu.c
irq_comm.c
irq.c
irq.h
Kconfig
kvm_cache_regs.h
lapic.c kvm: x86: do not use KVM_REQ_EVENT for APICv interrupt injection 2017-02-15 14:54:36 +01:00
lapic.h KVM: x86: preparatory changes for APICv cleanups 2017-02-15 14:54:34 +01:00
Makefile
mmu_audit.c
mmu.c kvm: x86: mmu: Verify that restored PTE has needed perms in fast page fault 2017-01-27 15:46:40 +01:00
mmu.h
mmutrace.h
mtrr.c
page_track.c
paging_tmpl.h
pmu_amd.c
pmu_intel.c
pmu.c
pmu.h
svm.c KVM: x86: do not scan IRR twice on APICv vmentry 2017-02-15 14:54:35 +01:00
trace.h
tss.h
vmx.c kvm: x86: do not use KVM_REQ_EVENT for APICv interrupt injection 2017-02-15 14:54:36 +01:00
x86.c kvm: x86: do not use KVM_REQ_EVENT for APICv interrupt injection 2017-02-15 14:54:36 +01:00
x86.h