KVM: vmx: skip VMWRITE of HOST_{FS,GS}_SEL when possible
authorSean Christopherson <sean.j.christopherson@intel.com>
Mon, 23 Jul 2018 19:32:49 +0000 (12:32 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 6 Aug 2018 15:59:16 +0000 (17:59 +0200)
On a 64-bit host, FS.sel and GS.sel are all but guaranteed to be 0,
which in turn means they'll rarely change.  Skip the VMWRITE for the
associated VMCS fields when loading host state if the selector hasn't
changed since the last VMWRITE.

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

index 60bf9a95219f25420f15b39fb6959c9f47fbc82c..4937e11f971a79664bee308b925eacd25c0f7829 100644 (file)
@@ -2717,16 +2717,20 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)
        gs_base = segment_base(gs_sel);
 #endif
 
-       host_state->fs_sel = fs_sel;
-       if (!(fs_sel & 7))
-               vmcs_write16(HOST_FS_SELECTOR, fs_sel);
-       else
-               vmcs_write16(HOST_FS_SELECTOR, 0);
-       host_state->gs_sel = gs_sel;
-       if (!(gs_sel & 7))
-               vmcs_write16(HOST_GS_SELECTOR, gs_sel);
-       else
-               vmcs_write16(HOST_GS_SELECTOR, 0);
+       if (unlikely(fs_sel != host_state->fs_sel)) {
+               if (!(fs_sel & 7))
+                       vmcs_write16(HOST_FS_SELECTOR, fs_sel);
+               else
+                       vmcs_write16(HOST_FS_SELECTOR, 0);
+               host_state->fs_sel = fs_sel;
+       }
+       if (unlikely(gs_sel != host_state->gs_sel)) {
+               if (!(gs_sel & 7))
+                       vmcs_write16(HOST_GS_SELECTOR, gs_sel);
+               else
+                       vmcs_write16(HOST_GS_SELECTOR, 0);
+               host_state->gs_sel = gs_sel;
+       }
 
        vmcs_writel(HOST_FS_BASE, fs_base);
        vmcs_writel(HOST_GS_BASE, gs_base);