|
@@ -11834,7 +11834,7 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
|
|
|
struct kvm_lapic_irq irq;
|
|
|
struct kvm_vcpu *vcpu;
|
|
|
struct vcpu_data vcpu_info;
|
|
|
- int idx, ret = -EINVAL;
|
|
|
+ int idx, ret = 0;
|
|
|
|
|
|
if (!kvm_arch_has_assigned_device(kvm) ||
|
|
|
!irq_remapping_cap(IRQ_POSTING_CAP) ||
|
|
@@ -11843,7 +11843,12 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
|
|
|
|
|
|
idx = srcu_read_lock(&kvm->irq_srcu);
|
|
|
irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
|
|
|
- BUG_ON(guest_irq >= irq_rt->nr_rt_entries);
|
|
|
+ if (guest_irq >= irq_rt->nr_rt_entries ||
|
|
|
+ hlist_empty(&irq_rt->map[guest_irq])) {
|
|
|
+ pr_warn_once("no route for guest_irq %u/%u (broken user space?)\n",
|
|
|
+ guest_irq, irq_rt->nr_rt_entries);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) {
|
|
|
if (e->type != KVM_IRQ_ROUTING_MSI)
|