kvm: x86: avoid atomic operations on APICv vmentry
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 20 Sep 2016 14:15:05 +0000 (16:15 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 3 Nov 2016 11:27:51 +0000 (12:27 +0100)
commitad3610919e6f6a4d815c5bf163556b950d6aea56
tree5a2a849d3f1020797701d8a3c993bb4bf342684b
parent1b07304c587d4fe572ea50bdefaa6047dc9a6d1a
kvm: x86: avoid atomic operations on APICv vmentry

On some benchmarks (e.g. netperf with ioeventfd disabled), APICv
posted interrupts turn out to be slower than interrupt injection via
KVM_REQ_EVENT.

This patch optimizes a bit the IRR update, avoiding expensive atomic
operations in the common case where PI.ON=0 at vmentry or the PIR vector
is mostly zero.  This saves at least 20 cycles (1%) per vmexit, as
measured by kvm-unit-tests' inl_from_qemu test (20 runs):

              | enable_apicv=1  |  enable_apicv=0
              | mean     stdev  |  mean     stdev
    ----------|-----------------|------------------
    before    | 5826     32.65  |  5765     47.09
    after     | 5809     43.42  |  5777     77.02

Of course, any change in the right column is just placebo effect. :)
The savings are bigger if interrupts are frequent.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/lapic.c
arch/x86/kvm/vmx.c