KVM: nSVM: move map argument out of enter_svm_guest_mode
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 13 May 2020 16:57:26 +0000 (12:57 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 1 Jun 2020 08:24:32 +0000 (04:24 -0400)
Unmapping the nested VMCB in enter_svm_guest_mode is a bit of a wart,
since the map argument is not used elsewhere in the function.  There are
just two callers, and those are also the place where kvm_vcpu_map is
called, so it is cleaner to unmap there.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/svm/svm.h

index 8756c9f463fd26afc7c11fcd086b8186e12277fa..8e98d5e420a50f72da82b8a57c890c15331de0c0 100644 (file)
@@ -229,7 +229,7 @@ static bool nested_vmcb_checks(struct vmcb *vmcb)
 }
 
 void enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb_gpa,
-                         struct vmcb *nested_vmcb, struct kvm_host_map *map)
+                         struct vmcb *nested_vmcb)
 {
        bool evaluate_pending_interrupts =
                is_intercept(svm, INTERCEPT_VINTR) ||
@@ -304,8 +304,6 @@ void enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb_gpa,
        svm->vmcb->control.pause_filter_thresh =
                nested_vmcb->control.pause_filter_thresh;
 
-       kvm_vcpu_unmap(&svm->vcpu, map, true);
-
        /* Enter Guest-Mode */
        enter_guest_mode(&svm->vcpu);
 
@@ -368,10 +366,7 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
                nested_vmcb->control.exit_code_hi = 0;
                nested_vmcb->control.exit_info_1  = 0;
                nested_vmcb->control.exit_info_2  = 0;
-
-               kvm_vcpu_unmap(&svm->vcpu, &map, true);
-
-               return ret;
+               goto out;
        }
 
        trace_kvm_nested_vmrun(svm->vmcb->save.rip, vmcb_gpa,
@@ -414,7 +409,7 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
        copy_vmcb_control_area(hsave, vmcb);
 
        svm->nested.nested_run_pending = 1;
-       enter_svm_guest_mode(svm, vmcb_gpa, nested_vmcb, &map);
+       enter_svm_guest_mode(svm, vmcb_gpa, nested_vmcb);
 
        if (!nested_svm_vmrun_msrpm(svm)) {
                svm->vmcb->control.exit_code    = SVM_EXIT_ERR;
@@ -425,6 +420,9 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
                nested_svm_vmexit(svm);
        }
 
+out:
+       kvm_vcpu_unmap(&svm->vcpu, &map, true);
+
        return ret;
 }
 
index feb96a410f2de0548efdd1b760205febe6b7fe17..76b3f553815e8dffc73b698a63899e9cd7bf6f28 100644 (file)
@@ -3814,7 +3814,8 @@ static int svm_pre_leave_smm(struct kvm_vcpu *vcpu, const char *smstate)
                if (kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(vmcb), &map) == -EINVAL)
                        return 1;
                nested_vmcb = map.hva;
-               enter_svm_guest_mode(svm, vmcb, nested_vmcb, &map);
+               enter_svm_guest_mode(svm, vmcb, nested_vmcb);
+               kvm_vcpu_unmap(&svm->vcpu, &map, true);
        }
        return 0;
 }
index 89fab75dd4f59f771c9507731b1594a6ff85db13..33e3f09d7a8e9785b602b140b6f0fd507cdaf2a1 100644 (file)
@@ -395,7 +395,7 @@ static inline bool nested_exit_on_nmi(struct vcpu_svm *svm)
 }
 
 void enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb_gpa,
-                         struct vmcb *nested_vmcb, struct kvm_host_map *map);
+                         struct vmcb *nested_vmcb);
 int nested_svm_vmrun(struct vcpu_svm *svm);
 void nested_svm_vmloadsave(struct vmcb *from_vmcb, struct vmcb *to_vmcb);
 int nested_svm_vmexit(struct vcpu_svm *svm);