diff options
author | Jan Kiszka <jan.kiszka@web.de> | 2009-05-30 10:01:45 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-06-16 15:36:47 -0500 |
commit | 8c14c17395809dfb2b20bd3598e067d2c5af7dc4 (patch) | |
tree | fbe326566bbbea7fd89f19078f145906fe4878e2 | |
parent | 6a7ad2998ca47711eddd191caa1a95f14459793f (diff) | |
download | qemu-8c14c17395809dfb2b20bd3598e067d2c5af7dc4.tar.gz qemu-8c14c17395809dfb2b20bd3598e067d2c5af7dc4.tar.bz2 qemu-8c14c17395809dfb2b20bd3598e067d2c5af7dc4.zip |
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>
-rw-r--r-- | kvm-all.c | 3 |
1 files changed, 1 insertions, 2 deletions
@@ -578,14 +578,13 @@ int kvm_cpu_exec(CPUState *env) dprintf("kvm_cpu_exec()\n"); do { - kvm_arch_pre_run(env, run); - if (env->exit_request) { dprintf("interrupt exit requested\n"); ret = 0; break; } + kvm_arch_pre_run(env, run); ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); kvm_arch_post_run(env, run); |