KVM: VMX: use kvm_fast_pio_in for handling IN I/O
authorSean Christopherson <sean.j.christopherson@intel.com>
Thu, 8 Mar 2018 16:57:26 +0000 (08:57 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 16 Mar 2018 21:01:38 +0000 (22:01 +0100)
Fast emulation of processor I/O for IN was disabled on x86 (both VMX
and SVM) some years ago due to a buggy implementation.  The addition
of kvm_fast_pio_in(), used by SVM, re-introduced (functional!) fast
emulation of IN.  Piggyback SVM's work and use kvm_fast_pio_in() on
VMX instead of performing full emulation of IN.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index 5d67a15..8d31e1b 100644 (file)
@@ -6270,15 +6270,15 @@ static int handle_io(struct kvm_vcpu *vcpu)
 
        exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
        string = (exit_qualification & 16) != 0;
-       in = (exit_qualification & 8) != 0;
 
        ++vcpu->stat.io_exits;
 
-       if (string || in)
+       if (string)
                return emulate_instruction(vcpu, 0) == EMULATE_DONE;
 
        port = exit_qualification >> 16;
        size = (exit_qualification & 7) + 1;
+       in = (exit_qualification & 8) != 0;
 
        ret = kvm_skip_emulated_instruction(vcpu);
 
@@ -6286,7 +6286,10 @@ static int handle_io(struct kvm_vcpu *vcpu)
         * TODO: we might be squashing a KVM_GUESTDBG_SINGLESTEP-triggered
         * KVM_EXIT_DEBUG here.
         */
-       return kvm_fast_pio_out(vcpu, size, port) && ret;
+       if (in)
+               return kvm_fast_pio_in(vcpu, size, port) && ret;
+       else
+               return kvm_fast_pio_out(vcpu, size, port) && ret;
 }
 
 static void