aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Christopherson <sean.j.christopherson@intel.com>2018-07-23 15:32:49 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2018-08-06 11:59:16 -0400
commit8f21a0bbf36f58334695ae6e46c0cf906a217154 (patch)
treee5eec36f1c8ed760755913d80ec90738c87a19e8
parentf3bbc0dcedf50d29d2d6fdfb16c5ec3e2368837f (diff)
KVM: vmx: skip VMWRITE of HOST_{FS,GS}_SEL when possible
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>
-rw-r--r--arch/x86/kvm/vmx.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 60bf9a95219f..4937e11f971a 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2717,16 +2717,20 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)
2717 gs_base = segment_base(gs_sel); 2717 gs_base = segment_base(gs_sel);
2718#endif 2718#endif
2719 2719
2720 host_state->fs_sel = fs_sel; 2720 if (unlikely(fs_sel != host_state->fs_sel)) {
2721 if (!(fs_sel & 7)) 2721 if (!(fs_sel & 7))
2722 vmcs_write16(HOST_FS_SELECTOR, fs_sel); 2722 vmcs_write16(HOST_FS_SELECTOR, fs_sel);
2723 else 2723 else
2724 vmcs_write16(HOST_FS_SELECTOR, 0); 2724 vmcs_write16(HOST_FS_SELECTOR, 0);
2725 host_state->gs_sel = gs_sel; 2725 host_state->fs_sel = fs_sel;
2726 if (!(gs_sel & 7)) 2726 }
2727 vmcs_write16(HOST_GS_SELECTOR, gs_sel); 2727 if (unlikely(gs_sel != host_state->gs_sel)) {
2728 else 2728 if (!(gs_sel & 7))
2729 vmcs_write16(HOST_GS_SELECTOR, 0); 2729 vmcs_write16(HOST_GS_SELECTOR, gs_sel);
2730 else
2731 vmcs_write16(HOST_GS_SELECTOR, 0);
2732 host_state->gs_sel = gs_sel;
2733 }
2730 2734
2731 vmcs_writel(HOST_FS_BASE, fs_base); 2735 vmcs_writel(HOST_FS_BASE, fs_base);
2732 vmcs_writel(HOST_GS_BASE, gs_base); 2736 vmcs_writel(HOST_GS_BASE, gs_base);