diff options
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r-- | virt/kvm/irq_comm.c | 20 |
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 | */ |
161 | int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level) | 161 | int 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 | ||
275 | int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, | 275 | int 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; |