diff options
author | Andrey Smetanin <asmetanin@virtuozzo.com> | 2015-10-16 03:07:46 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-10-16 04:34:29 -0400 |
commit | ba1aefcd6db5536d3eb3ca3ce7bd6786960140ea (patch) | |
tree | 27fd2764e673359414fb485908b42f0f200dd2b2 /virt | |
parent | 351dc6477cd35136ce4668401b1b1332a62908a8 (diff) |
kvm/eventfd: factor out kvm_notify_acked_gsi()
Factor out kvm_notify_acked_gsi() helper to iterate over EOI listeners
and notify those matching the given gsi.
It will be reused in the upcoming Hyper-V SynIC implementation.
Signed-off-by: Andrey Smetanin <asmetanin@virtuozzo.com>
Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Vitaly Kuznetsov <vkuznets@redhat.com>
CC: "K. Y. Srinivasan" <kys@microsoft.com>
CC: Gleb Natapov <gleb@kernel.org>
CC: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/eventfd.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 518421e65b0d..f6b986a41823 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c | |||
@@ -451,9 +451,18 @@ bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin) | |||
451 | } | 451 | } |
452 | EXPORT_SYMBOL_GPL(kvm_irq_has_notifier); | 452 | EXPORT_SYMBOL_GPL(kvm_irq_has_notifier); |
453 | 453 | ||
454 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) | 454 | void kvm_notify_acked_gsi(struct kvm *kvm, int gsi) |
455 | { | 455 | { |
456 | struct kvm_irq_ack_notifier *kian; | 456 | struct kvm_irq_ack_notifier *kian; |
457 | |||
458 | hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, | ||
459 | link) | ||
460 | if (kian->gsi == gsi) | ||
461 | kian->irq_acked(kian); | ||
462 | } | ||
463 | |||
464 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) | ||
465 | { | ||
457 | int gsi, idx; | 466 | int gsi, idx; |
458 | 467 | ||
459 | trace_kvm_ack_irq(irqchip, pin); | 468 | trace_kvm_ack_irq(irqchip, pin); |
@@ -461,10 +470,7 @@ void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) | |||
461 | idx = srcu_read_lock(&kvm->irq_srcu); | 470 | idx = srcu_read_lock(&kvm->irq_srcu); |
462 | gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin); | 471 | gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin); |
463 | if (gsi != -1) | 472 | if (gsi != -1) |
464 | hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, | 473 | kvm_notify_acked_gsi(kvm, gsi); |
465 | link) | ||
466 | if (kian->gsi == gsi) | ||
467 | kian->irq_acked(kian); | ||
468 | srcu_read_unlock(&kvm->irq_srcu, idx); | 474 | srcu_read_unlock(&kvm->irq_srcu, idx); |
469 | } | 475 | } |
470 | 476 | ||