diff options
author | Avi Kivity <avi@redhat.com> | 2011-03-07 10:37:37 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-05-11 07:56:56 -0400 |
commit | c5ca8e572c4d8cb8dec1cf5b3fc9c7066f6b2c29 (patch) | |
tree | 5e5fd00c9d3464e984b8821293b409a0954978a6 /arch/x86 | |
parent | 00eba012d53e63f620455f7013917e4bf59424f2 (diff) |
KVM: VMX: Don't VMREAD VM_EXIT_INTR_INFO unconditionally
Only read it if we're going to use it later.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kvm/vmx.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 51aa827e3bb..f95f48b2600 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -3902,6 +3902,7 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) | |||
3902 | || vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI)) | 3902 | || vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI)) |
3903 | return; | 3903 | return; |
3904 | 3904 | ||
3905 | vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
3905 | exit_intr_info = vmx->exit_intr_info; | 3906 | exit_intr_info = vmx->exit_intr_info; |
3906 | 3907 | ||
3907 | /* Handle machine checks before interrupts are enabled */ | 3908 | /* Handle machine checks before interrupts are enabled */ |
@@ -3919,7 +3920,7 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) | |||
3919 | 3920 | ||
3920 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | 3921 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) |
3921 | { | 3922 | { |
3922 | u32 exit_intr_info = vmx->exit_intr_info; | 3923 | u32 exit_intr_info; |
3923 | bool unblock_nmi; | 3924 | bool unblock_nmi; |
3924 | u8 vector; | 3925 | u8 vector; |
3925 | bool idtv_info_valid; | 3926 | bool idtv_info_valid; |
@@ -3929,6 +3930,11 @@ static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | |||
3929 | if (cpu_has_virtual_nmis()) { | 3930 | if (cpu_has_virtual_nmis()) { |
3930 | if (vmx->nmi_known_unmasked) | 3931 | if (vmx->nmi_known_unmasked) |
3931 | return; | 3932 | return; |
3933 | /* | ||
3934 | * Can't use vmx->exit_intr_info since we're not sure what | ||
3935 | * the exit reason is. | ||
3936 | */ | ||
3937 | exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
3932 | unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0; | 3938 | unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0; |
3933 | vector = exit_intr_info & INTR_INFO_VECTOR_MASK; | 3939 | vector = exit_intr_info & INTR_INFO_VECTOR_MASK; |
3934 | /* | 3940 | /* |
@@ -4176,7 +4182,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) | |||
4176 | vmx->launched = 1; | 4182 | vmx->launched = 1; |
4177 | 4183 | ||
4178 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); | 4184 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); |
4179 | vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); | ||
4180 | 4185 | ||
4181 | vmx_complete_atomic_exit(vmx); | 4186 | vmx_complete_atomic_exit(vmx); |
4182 | vmx_recover_nmi_blocking(vmx); | 4187 | vmx_recover_nmi_blocking(vmx); |