Commit 8c14c17395809dfb2b20bd3598e067d2c5af7dc4
Committed by
Anthony Liguori
1 parent
6a7ad299
kvm: Fix IRQ injection into full queue
User space may only inject interrupts during kvm_arch_pre_run if ready_for_interrupt_injection is set in kvm_run. But that field is updated on exit from KVM_RUN, so we must ensure that we enter the kernel after potentially queuing an interrupt, otherwise we risk to loose one - like it happens with the current code against latest kernel modules (since kvm-86) that started to queue only a single interrupt. Fix the problem by reordering kvm_cpu_exec. Credits go to Gleb Natapov for analyzing the issue in details. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
1 additions
and
2 deletions
kvm-all.c
... | ... | @@ -578,14 +578,13 @@ int kvm_cpu_exec(CPUState *env) |
578 | 578 | dprintf("kvm_cpu_exec()\n"); |
579 | 579 | |
580 | 580 | do { |
581 | - kvm_arch_pre_run(env, run); | |
582 | - | |
583 | 581 | if (env->exit_request) { |
584 | 582 | dprintf("interrupt exit requested\n"); |
585 | 583 | ret = 0; |
586 | 584 | break; |
587 | 585 | } |
588 | 586 | |
587 | + kvm_arch_pre_run(env, run); | |
589 | 588 | ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); |
590 | 589 | kvm_arch_post_run(env, run); |
591 | 590 | ... | ... |