KVM: x86: properly update ready_for_interrupt_injection
The recent changes to emulate string instructions without entering guest mode exposed a bug where pending interrupts are not properly reflected in ready_for_interrupt_injection.
The result is that userspace overwrites a previously queued interrupt, when irqchip's are emulated in qemu.
Fix by always updating state before returning to userspace.
arch/x86/kvm/x86.c +1 -1
@@ -4653,7 +4653,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) }srcu_read_unlock (&kvm->srcu, vcpu->srcu_idx); -post_kvm_run_save (vcpu);vapic_exit (vcpu);
@@ -4703,6 +4702,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) r =__vcpu_run (vcpu); out: +post_kvm_run_save (vcpu);if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL );
Avi Kivity
AppliedQuoted 8 lines · Marcelo Tosatti
The recent changes to emulate string instructions without entering guest mode exposed a bug where pending interrupts are not properly reflected in
ready_for_interrupt_injection.The result is that userspace overwrites a previously queued interrupt, when irqchip's are emulated in qemu.
Applied, thanks.
Quoted 2 lines
Fix by always updating state before returning to userspace.
Why are we even doing this if irqchip_in_kernel?
Signature · 1 line
error compiling committee.c: too many arguments to function