aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/irq_comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r--virt/kvm/irq_comm.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
index a228ee82bad2..175844593243 100644
--- a/virt/kvm/irq_comm.c
+++ b/virt/kvm/irq_comm.c
@@ -160,6 +160,7 @@ static int kvm_set_msi_inatomic(struct kvm_kernel_irq_routing_entry *e,
160 */ 160 */
161int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level) 161int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
162{ 162{
163 struct kvm_kernel_irq_routing_entry entries[KVM_NR_IRQCHIPS];
163 struct kvm_kernel_irq_routing_entry *e; 164 struct kvm_kernel_irq_routing_entry *e;
164 int ret = -EINVAL; 165 int ret = -EINVAL;
165 struct kvm_irq_routing_table *irq_rt; 166 struct kvm_irq_routing_table *irq_rt;
@@ -177,14 +178,13 @@ int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
177 */ 178 */
178 idx = srcu_read_lock(&kvm->irq_srcu); 179 idx = srcu_read_lock(&kvm->irq_srcu);
179 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); 180 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
180 if (irq < irq_rt->nr_rt_entries) 181 if (kvm_irq_map_gsi(entries, irq_rt, irq) > 0) {
181 hlist_for_each_entry(e, &irq_rt->map[irq], link) { 182 e = &entries[0];
182 if (likely(e->type == KVM_IRQ_ROUTING_MSI)) 183 if (likely(e->type == KVM_IRQ_ROUTING_MSI))
183 ret = kvm_set_msi_inatomic(e, kvm); 184 ret = kvm_set_msi_inatomic(e, kvm);
184 else 185 else
185 ret = -EWOULDBLOCK; 186 ret = -EWOULDBLOCK;
186 break; 187 }
187 }
188 srcu_read_unlock(&kvm->irq_srcu, idx); 188 srcu_read_unlock(&kvm->irq_srcu, idx);
189 return ret; 189 return ret;
190} 190}
@@ -272,8 +272,7 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
272 srcu_read_unlock(&kvm->irq_srcu, idx); 272 srcu_read_unlock(&kvm->irq_srcu, idx);
273} 273}
274 274
275int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, 275int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
276 struct kvm_kernel_irq_routing_entry *e,
277 const struct kvm_irq_routing_entry *ue) 276 const struct kvm_irq_routing_entry *ue)
278{ 277{
279 int r = -EINVAL; 278 int r = -EINVAL;
@@ -304,7 +303,6 @@ int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
304 e->irqchip.pin = ue->u.irqchip.pin + delta; 303 e->irqchip.pin = ue->u.irqchip.pin + delta;
305 if (e->irqchip.pin >= max_pin) 304 if (e->irqchip.pin >= max_pin)
306 goto out; 305 goto out;
307 rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
308 break; 306 break;
309 case KVM_IRQ_ROUTING_MSI: 307 case KVM_IRQ_ROUTING_MSI:
310 e->set = kvm_set_msi; 308 e->set = kvm_set_msi;