mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-09-09 08:17:53 -06:00
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>
This commit is contained in:
parent
6a7ad2998c
commit
8c14c17395
1 changed files with 1 additions and 2 deletions
|
@ -578,14 +578,13 @@ int kvm_cpu_exec(CPUState *env)
|
||||||
dprintf("kvm_cpu_exec()\n");
|
dprintf("kvm_cpu_exec()\n");
|
||||||
|
|
||||||
do {
|
do {
|
||||||
kvm_arch_pre_run(env, run);
|
|
||||||
|
|
||||||
if (env->exit_request) {
|
if (env->exit_request) {
|
||||||
dprintf("interrupt exit requested\n");
|
dprintf("interrupt exit requested\n");
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kvm_arch_pre_run(env, run);
|
||||||
ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
|
ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
|
||||||
kvm_arch_post_run(env, run);
|
kvm_arch_post_run(env, run);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue