275 struct kvm_kernel_irq_routing_entry *e;
276 struct kvm_irq_routing_table *irq_rt;
277 struct kvm_lapic_irq irq;
278 struct kvm_vcpu *vcpu;
279 struct vcpu_data vcpu_info;
285 idx = srcu_read_lock(&kvm->irq_srcu);
286 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
287 if (guest_irq >= irq_rt->nr_rt_entries ||
288 hlist_empty(&irq_rt->map[guest_irq])) {
289 pr_warn_once(
"no route for guest_irq %u/%u (broken user space?)\n",
290 guest_irq, irq_rt->nr_rt_entries);
294 hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) {
295 if (e->type != KVM_IRQ_ROUTING_MSI)
315 !kvm_irq_is_postable(&irq)) {
320 ret = irq_set_vcpu_affinity(host_irq, NULL);
323 "failed to back to remapped mode, irq: %u\n",
332 vcpu_info.vector = irq.vector;
334 trace_kvm_pi_irte_update(host_irq, vcpu->vcpu_id, e->gsi,
335 vcpu_info.vector, vcpu_info.pi_desc_addr, set);
338 ret = irq_set_vcpu_affinity(host_irq, &vcpu_info);
340 ret = irq_set_vcpu_affinity(host_irq, NULL);
343 printk(KERN_INFO
"%s: failed to update PI IRTE\n",
351 srcu_read_unlock(&kvm->irq_srcu, idx);
void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, struct kvm_lapic_irq *irq)
bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, struct kvm_vcpu **dest_vcpu)