diff options
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r-- | virt/kvm/irq_comm.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index a0e88809e45e..369e38010ad5 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * Authors: | 17 | * Authors: |
18 | * Yaozu (Eddie) Dong <Eddie.dong@intel.com> | 18 | * Yaozu (Eddie) Dong <Eddie.dong@intel.com> |
19 | * | 19 | * |
20 | * Copyright 2010 Red Hat, Inc. and/or its affilates. | ||
20 | */ | 21 | */ |
21 | 22 | ||
22 | #include <linux/kvm_host.h> | 23 | #include <linux/kvm_host.h> |
@@ -99,7 +100,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, | |||
99 | if (r < 0) | 100 | if (r < 0) |
100 | r = 0; | 101 | r = 0; |
101 | r += kvm_apic_set_irq(vcpu, irq); | 102 | r += kvm_apic_set_irq(vcpu, irq); |
102 | } else { | 103 | } else if (kvm_lapic_enabled(vcpu)) { |
103 | if (!lowest) | 104 | if (!lowest) |
104 | lowest = vcpu; | 105 | lowest = vcpu; |
105 | else if (kvm_apic_compare_prio(vcpu, lowest) < 0) | 106 | else if (kvm_apic_compare_prio(vcpu, lowest) < 0) |
@@ -278,15 +279,19 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, | |||
278 | synchronize_rcu(); | 279 | synchronize_rcu(); |
279 | } | 280 | } |
280 | 281 | ||
281 | void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask) | 282 | void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, |
283 | bool mask) | ||
282 | { | 284 | { |
283 | struct kvm_irq_mask_notifier *kimn; | 285 | struct kvm_irq_mask_notifier *kimn; |
284 | struct hlist_node *n; | 286 | struct hlist_node *n; |
287 | int gsi; | ||
285 | 288 | ||
286 | rcu_read_lock(); | 289 | rcu_read_lock(); |
287 | hlist_for_each_entry_rcu(kimn, n, &kvm->mask_notifier_list, link) | 290 | gsi = rcu_dereference(kvm->irq_routing)->chip[irqchip][pin]; |
288 | if (kimn->irq == irq) | 291 | if (gsi != -1) |
289 | kimn->func(kimn, mask); | 292 | hlist_for_each_entry_rcu(kimn, n, &kvm->mask_notifier_list, link) |
293 | if (kimn->irq == gsi) | ||
294 | kimn->func(kimn, mask); | ||
290 | rcu_read_unlock(); | 295 | rcu_read_unlock(); |
291 | } | 296 | } |
292 | 297 | ||