@@ -143,8 +143,8 @@ int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
*/
int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level)
{
- struct kvm_kernel_irq_routing_entry *e, irq_set[KVM_NR_IRQCHIPS];
- int ret = -1, i = 0;
+ struct kvm_kernel_irq_routing_entry *e;
+ int ret = -1;
struct kvm_irq_routing_table *irq_rt;
struct hlist_node *n;
@@ -157,19 +157,14 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level)
rcu_read_lock();
irq_rt = rcu_dereference(kvm->irq_routing);
if (irq < irq_rt->nr_rt_entries)
- hlist_for_each_entry(e, n, &irq_rt->map[irq], link)
- irq_set[i++] = *e;
+ hlist_for_each_entry(e, n, &irq_rt->map[irq], link) {
+ int r = e->set(e, kvm, irq_source_id, level);
+ if (r < 0)
+ continue;
+ ret = r + ((ret < 0) ? 0 : ret);
+ }
rcu_read_unlock();
- while(i--) {
- int r;
- r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level);
- if (r < 0)
- continue;
-
- ret = r + ((ret < 0) ? 0 : ret);
- }
-
return ret;
}
Callbacks are no longer sleep. Signed-off-by: Gleb Natapov <gleb@redhat.com> --- virt/kvm/irq_comm.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-)