KVM: nVMX: Move nested VM-Exit tracepoint into nested_vmx_reflect_vmexit()
authorSean Christopherson <sean.j.christopherson@intel.com>
Wed, 15 Apr 2020 17:55:13 +0000 (10:55 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 21 Apr 2020 13:13:03 +0000 (09:13 -0400)
Move the tracepoint for nested VM-Exits in preparation of splitting the
reflection logic into L1 wants the exit vs. L0 always handles the exit.

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

index cb7fd78..de122ef 100644 (file)
@@ -5648,19 +5648,13 @@ static bool nested_vmx_exit_handled_mtf(struct vmcs12 *vmcs12)
  */
 static bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
 {
-       u32 intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
        struct vcpu_vmx *vmx = to_vmx(vcpu);
        struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
-
-       trace_kvm_nested_vmexit(kvm_rip_read(vcpu), exit_reason,
-                               vmcs_readl(EXIT_QUALIFICATION),
-                               vmx->idt_vectoring_info,
-                               intr_info,
-                               vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
-                               KVM_ISA_VMX);
+       u32 intr_info;
 
        switch (exit_reason) {
        case EXIT_REASON_EXCEPTION_NMI:
+               intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
                if (is_nmi(intr_info))
                        return false;
                else if (is_page_fault(intr_info))
@@ -5828,6 +5822,14 @@ bool nested_vmx_reflect_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason)
                goto reflect_vmexit;
        }
 
+       exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
+       exit_qual = vmcs_readl(EXIT_QUALIFICATION);
+
+       trace_kvm_nested_vmexit(kvm_rip_read(vcpu), exit_reason, exit_qual,
+                               vmx->idt_vectoring_info, exit_intr_info,
+                               vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
+                               KVM_ISA_VMX);
+
        if (!nested_vmx_exit_reflected(vcpu, exit_reason))
                return false;
 
@@ -5838,7 +5840,6 @@ bool nested_vmx_reflect_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason)
         */
        WARN_ON(exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT);
 
-       exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
        if ((exit_intr_info &
             (INTR_INFO_VALID_MASK | INTR_INFO_DELIVER_CODE_MASK)) ==
            (INTR_INFO_VALID_MASK | INTR_INFO_DELIVER_CODE_MASK)) {
@@ -5847,7 +5848,6 @@ bool nested_vmx_reflect_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason)
                vmcs12->vm_exit_intr_error_code =
                        vmcs_read32(VM_EXIT_INTR_ERROR_CODE);
        }
-       exit_qual = vmcs_readl(EXIT_QUALIFICATION);
 
 reflect_vmexit:
        nested_vmx_vmexit(vcpu, exit_reason, exit_intr_info, exit_qual);