kvm/x86: return meaningful value from KVM_SIGNAL_MSI
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>
This commit is contained in:
parent
4fef0f4913
commit
0624fca951
|
@ -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);
|
map = rcu_dereference(kvm->arch.apic_map);
|
||||||
|
|
||||||
ret = kvm_apic_map_get_dest_lapic(kvm, &src, irq, map, &dst, &bitmap);
|
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) {
|
for_each_set_bit(i, &bitmap, 16) {
|
||||||
if (!dst[i])
|
if (!dst[i])
|
||||||
continue;
|
continue;
|
||||||
if (*r < 0)
|
|
||||||
*r = 0;
|
|
||||||
*r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map);
|
*r += kvm_apic_set_irq(dst[i]->vcpu, irq, dest_map);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue