diff options
author | Avi Kivity <avi@redhat.com> | 2009-12-30 11:07:40 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2010-03-01 10:35:50 -0500 |
commit | edcafe3c5a06f46407c3f60145a36f269e56ff7f (patch) | |
tree | 3fc9e54eec11f0481e5d9e8517941f651866463b | |
parent | 02daab21d94dc4cf01b2fd09863d59a436900322 (diff) |
KVM: VMX: Give the guest ownership of cr0.ts when the fpu is active
If the guest fpu is loaded, there is nothing interesing about cr0.ts; let
the guest play with it as it will. This makes context switches between fpu
intensive guest processes faster, as we won't trap the clts and cr0 write
instructions.
[marcelo: fix cr0 read shadow update on fpu deactivation; kills F8 install]
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | arch/x86/kvm/vmx.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index d11be3fb7c80..fc1964d5e97c 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -803,12 +803,20 @@ static void vmx_fpu_activate(struct kvm_vcpu *vcpu) | |||
803 | if (kvm_read_cr0_bits(vcpu, X86_CR0_TS)) | 803 | if (kvm_read_cr0_bits(vcpu, X86_CR0_TS)) |
804 | vmcs_set_bits(GUEST_CR0, X86_CR0_TS); | 804 | vmcs_set_bits(GUEST_CR0, X86_CR0_TS); |
805 | update_exception_bitmap(vcpu); | 805 | update_exception_bitmap(vcpu); |
806 | vcpu->arch.cr0_guest_owned_bits = X86_CR0_TS; | ||
807 | vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); | ||
806 | } | 808 | } |
807 | 809 | ||
810 | static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu); | ||
811 | |||
808 | static void vmx_fpu_deactivate(struct kvm_vcpu *vcpu) | 812 | static void vmx_fpu_deactivate(struct kvm_vcpu *vcpu) |
809 | { | 813 | { |
814 | vmx_decache_cr0_guest_bits(vcpu); | ||
810 | vmcs_set_bits(GUEST_CR0, X86_CR0_TS); | 815 | vmcs_set_bits(GUEST_CR0, X86_CR0_TS); |
811 | update_exception_bitmap(vcpu); | 816 | update_exception_bitmap(vcpu); |
817 | vcpu->arch.cr0_guest_owned_bits = 0; | ||
818 | vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); | ||
819 | vmcs_writel(CR0_READ_SHADOW, vcpu->arch.cr0); | ||
812 | } | 820 | } |
813 | 821 | ||
814 | static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu) | 822 | static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu) |
@@ -2996,8 +3004,7 @@ static int handle_cr(struct kvm_vcpu *vcpu) | |||
2996 | }; | 3004 | }; |
2997 | break; | 3005 | break; |
2998 | case 2: /* clts */ | 3006 | case 2: /* clts */ |
2999 | vcpu->arch.cr0 &= ~X86_CR0_TS; | 3007 | vmx_set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~X86_CR0_TS)); |
3000 | vmcs_writel(CR0_READ_SHADOW, kvm_read_cr0(vcpu)); | ||
3001 | trace_kvm_cr_write(0, kvm_read_cr0(vcpu)); | 3008 | trace_kvm_cr_write(0, kvm_read_cr0(vcpu)); |
3002 | skip_emulated_instruction(vcpu); | 3009 | skip_emulated_instruction(vcpu); |
3003 | return 1; | 3010 | return 1; |