Commit 8c14c17395809dfb2b20bd3598e067d2c5af7dc4

Authored by Jan Kiszka
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