diff options
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r-- | arch/x86/kvm/vmx.c | 24 |
1 files changed, 2 insertions, 22 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 487e1dcdce33..6259d7467648 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -2498,15 +2498,13 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
2498 | } | 2498 | } |
2499 | if (vcpu->arch.nmi_injected) { | 2499 | if (vcpu->arch.nmi_injected) { |
2500 | vmx_inject_nmi(vcpu); | 2500 | vmx_inject_nmi(vcpu); |
2501 | if (vcpu->arch.nmi_pending || kvm_run->request_nmi_window) | 2501 | if (vcpu->arch.nmi_pending) |
2502 | enable_nmi_window(vcpu); | 2502 | enable_nmi_window(vcpu); |
2503 | else if (vcpu->arch.irq_summary | 2503 | else if (vcpu->arch.irq_summary |
2504 | || kvm_run->request_interrupt_window) | 2504 | || kvm_run->request_interrupt_window) |
2505 | enable_irq_window(vcpu); | 2505 | enable_irq_window(vcpu); |
2506 | return; | 2506 | return; |
2507 | } | 2507 | } |
2508 | if (!vcpu->arch.nmi_window_open || kvm_run->request_nmi_window) | ||
2509 | enable_nmi_window(vcpu); | ||
2510 | 2508 | ||
2511 | if (vcpu->arch.interrupt_window_open) { | 2509 | if (vcpu->arch.interrupt_window_open) { |
2512 | if (vcpu->arch.irq_summary && !vcpu->arch.interrupt.pending) | 2510 | if (vcpu->arch.irq_summary && !vcpu->arch.interrupt.pending) |
@@ -3040,14 +3038,6 @@ static int handle_nmi_window(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3040 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | 3038 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); |
3041 | ++vcpu->stat.nmi_window_exits; | 3039 | ++vcpu->stat.nmi_window_exits; |
3042 | 3040 | ||
3043 | /* | ||
3044 | * If the user space waits to inject a NMI, exit as soon as possible | ||
3045 | */ | ||
3046 | if (kvm_run->request_nmi_window && !vcpu->arch.nmi_pending) { | ||
3047 | kvm_run->exit_reason = KVM_EXIT_NMI_WINDOW_OPEN; | ||
3048 | return 0; | ||
3049 | } | ||
3050 | |||
3051 | return 1; | 3041 | return 1; |
3052 | } | 3042 | } |
3053 | 3043 | ||
@@ -3162,7 +3152,7 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
3162 | vmx->soft_vnmi_blocked = 0; | 3152 | vmx->soft_vnmi_blocked = 0; |
3163 | vcpu->arch.nmi_window_open = 1; | 3153 | vcpu->arch.nmi_window_open = 1; |
3164 | } else if (vmx->vnmi_blocked_time > 1000000000LL && | 3154 | } else if (vmx->vnmi_blocked_time > 1000000000LL && |
3165 | (kvm_run->request_nmi_window || vcpu->arch.nmi_pending)) { | 3155 | vcpu->arch.nmi_pending) { |
3166 | /* | 3156 | /* |
3167 | * This CPU don't support us in finding the end of an | 3157 | * This CPU don't support us in finding the end of an |
3168 | * NMI-blocked window if the guest runs with IRQs | 3158 | * NMI-blocked window if the guest runs with IRQs |
@@ -3175,16 +3165,6 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
3175 | vmx->soft_vnmi_blocked = 0; | 3165 | vmx->soft_vnmi_blocked = 0; |
3176 | vmx->vcpu.arch.nmi_window_open = 1; | 3166 | vmx->vcpu.arch.nmi_window_open = 1; |
3177 | } | 3167 | } |
3178 | |||
3179 | /* | ||
3180 | * If the user space waits to inject an NNI, exit ASAP | ||
3181 | */ | ||
3182 | if (vcpu->arch.nmi_window_open && kvm_run->request_nmi_window | ||
3183 | && !vcpu->arch.nmi_pending) { | ||
3184 | kvm_run->exit_reason = KVM_EXIT_NMI_WINDOW_OPEN; | ||
3185 | ++vcpu->stat.nmi_window_exits; | ||
3186 | return 0; | ||
3187 | } | ||
3188 | } | 3168 | } |
3189 | 3169 | ||
3190 | if (exit_reason < kvm_vmx_max_exit_handlers | 3170 | if (exit_reason < kvm_vmx_max_exit_handlers |