diff options
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r-- | arch/x86/kvm/svm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 8fc6eea148e7..6eef6d22e87e 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -2091,8 +2091,9 @@ static int interrupt_window_interception(struct vcpu_svm *svm, | |||
2091 | * If the user space waits to inject interrupts, exit as soon as | 2091 | * If the user space waits to inject interrupts, exit as soon as |
2092 | * possible | 2092 | * possible |
2093 | */ | 2093 | */ |
2094 | if (kvm_run->request_interrupt_window && | 2094 | if (!irqchip_in_kernel(svm->vcpu.kvm) && |
2095 | !svm->vcpu.arch.irq_summary) { | 2095 | kvm_run->request_interrupt_window && |
2096 | !kvm_cpu_has_interrupt(&svm->vcpu)) { | ||
2096 | ++svm->vcpu.stat.irq_window_exits; | 2097 | ++svm->vcpu.stat.irq_window_exits; |
2097 | kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN; | 2098 | kvm_run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN; |
2098 | return 0; | 2099 | return 0; |
@@ -2373,7 +2374,8 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
2373 | (svm->vmcb->save.rflags & X86_EFLAGS_IF) && | 2374 | (svm->vmcb->save.rflags & X86_EFLAGS_IF) && |
2374 | (svm->vcpu.arch.hflags & HF_GIF_MASK)); | 2375 | (svm->vcpu.arch.hflags & HF_GIF_MASK)); |
2375 | 2376 | ||
2376 | if (svm->vcpu.arch.interrupt_window_open && svm->vcpu.arch.irq_summary) | 2377 | if (svm->vcpu.arch.interrupt_window_open && |
2378 | kvm_cpu_has_interrupt(&svm->vcpu)) | ||
2377 | /* | 2379 | /* |
2378 | * If interrupts enabled, and not blocked by sti or mov ss. Good. | 2380 | * If interrupts enabled, and not blocked by sti or mov ss. Good. |
2379 | */ | 2381 | */ |
@@ -2383,7 +2385,8 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
2383 | * Interrupts blocked. Wait for unblock. | 2385 | * Interrupts blocked. Wait for unblock. |
2384 | */ | 2386 | */ |
2385 | if (!svm->vcpu.arch.interrupt_window_open && | 2387 | if (!svm->vcpu.arch.interrupt_window_open && |
2386 | (svm->vcpu.arch.irq_summary || kvm_run->request_interrupt_window)) | 2388 | (kvm_cpu_has_interrupt(&svm->vcpu) || |
2389 | kvm_run->request_interrupt_window)) | ||
2387 | svm_set_vintr(svm); | 2390 | svm_set_vintr(svm); |
2388 | else | 2391 | else |
2389 | svm_clear_vintr(svm); | 2392 | svm_clear_vintr(svm); |