kvm/x86: return meaningful value from KVM_SIGNAL_MSI
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 1 Oct 2018 14:07:18 +0000 (16:07 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Oct 2018 22:29:43 +0000 (00:29 +0200)
If kvm_apic_map_get_dest_lapic() finds a disabled LAPIC,
it will return with bitmap==0 and (*r == -1) will be returned to
userspace.

QEMU may then record "KVM: injection failed, MSI lost
(Operation not permitted)" in its log, which is quite puzzling.

Reported-by: Peng Hao <penghao122@sina.com.cn>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/lapic.c

index 91ffb63397f523d068426036b8abee597ac2c1ea..452eed992aeade8360a695bb04569e99f6c3d0f9 100644 (file)
@@ -960,14 +960,14 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
        map = rcu_dereference(kvm->arch.apic_map);
 
        ret = kvm_apic_map_get_dest_lapic(kvm, &src, irq, map, &dst, &bitmap);
-       if (ret)
+       if (ret) {
+               *r = 0;
                for_each_set_bit(i, &bitmap, 16) {
                        if (!dst[i])
                                continue;
-                       if (*r < 0)
-                               *r = 0;
                        *r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map);
                }
+       }
 
        rcu_read_unlock();
        return ret;