]> xenbits.xensource.com Git - xen.git/commitdiff
x86/vmx: Defer vmx_vmcs_exit() as long as possible in construct_vmcs()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 28 May 2018 14:02:34 +0000 (15:02 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 14 Aug 2018 16:39:56 +0000 (17:39 +0100)
paging_update_paging_modes() and vmx_vlapic_msr_changed() both operate on the
VMCS being constructed.  Avoid dropping and re-acquiring the reference
multiple times.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
(cherry picked from commit f30e3cf34042846e391e3f8361fc6a76d181a7ee)

xen/arch/x86/hvm/vmx/vmcs.c

index 60ef8a8c5b353a5e96f193be97dc17c442867d77..d419f80be383aa498955137c54b8e740e40db7b0 100644 (file)
@@ -983,6 +983,7 @@ static int construct_vmcs(struct vcpu *v)
     unsigned long sysenter_eip;
     u32 vmexit_ctl = vmx_vmexit_control;
     u32 vmentry_ctl = vmx_vmentry_control;
+    int rc = 0;
 
     vmx_vmcs_enter(v);
 
@@ -1074,8 +1075,8 @@ static int construct_vmcs(struct vcpu *v)
 
         if ( msr_bitmap == NULL )
         {
-            vmx_vmcs_exit(v);
-            return -ENOMEM;
+            rc = -ENOMEM;
+            goto out;
         }
 
         memset(msr_bitmap, ~0, PAGE_SIZE);
@@ -1271,8 +1272,6 @@ static int construct_vmcs(struct vcpu *v)
     if ( cpu_has_vmx_mpx )
         __vmwrite(GUEST_BNDCFGS, 0);
 
-    vmx_vmcs_exit(v);
-
     /* PVH: paging mode is updated by arch_set_info_guest(). */
     if ( is_hvm_domain(d) )
     {
@@ -1282,7 +1281,10 @@ static int construct_vmcs(struct vcpu *v)
         vmx_vlapic_msr_changed(v);
     }
 
-    return 0;
+ out:
+    vmx_vmcs_exit(v);
+
+    return rc;
 }
 
 int vmx_read_guest_msr(u32 msr, u64 *val)