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,14 +578,13 @@ int kvm_cpu_exec(CPUState *env) | ||
| 578 | dprintf("kvm_cpu_exec()\n"); | 578 | dprintf("kvm_cpu_exec()\n"); |
| 579 | 579 | ||
| 580 | do { | 580 | do { |
| 581 | - kvm_arch_pre_run(env, run); | ||
| 582 | - | ||
| 583 | if (env->exit_request) { | 581 | if (env->exit_request) { |
| 584 | dprintf("interrupt exit requested\n"); | 582 | dprintf("interrupt exit requested\n"); |
| 585 | ret = 0; | 583 | ret = 0; |
| 586 | break; | 584 | break; |
| 587 | } | 585 | } |
| 588 | 586 | ||
| 587 | + kvm_arch_pre_run(env, run); | ||
| 589 | ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); | 588 | ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); |
| 590 | kvm_arch_post_run(env, run); | 589 | kvm_arch_post_run(env, run); |
| 591 | 590 |