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 | ... | ... |