Commit 9016cfb577a15abd6a7990890ccf6bf1edf04d31

Authored by Eric Auger
Committed by Paolo Bonzini
1 parent 1a02b27035

KVM: eventfd: add irq bypass consumer management

This patch adds the registration/unregistration of an
irq_bypass_consumer on irqfd assignment/deassignment.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Signed-off-by: Feng Wu <feng.wu@intel.com>
Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Showing 2 changed files with 17 additions and 0 deletions Side-by-side Diff

include/linux/kvm_irqfd.h
... ... @@ -64,6 +64,8 @@
64 64 struct list_head list;
65 65 poll_table pt;
66 66 struct work_struct shutdown;
  67 + struct irq_bypass_consumer consumer;
  68 + struct irq_bypass_producer *producer;
67 69 };
68 70  
69 71 #endif /* __LINUX_KVM_IRQFD_H */
... ... @@ -35,6 +35,7 @@
35 35 #include <linux/srcu.h>
36 36 #include <linux/slab.h>
37 37 #include <linux/seqlock.h>
  38 +#include <linux/irqbypass.h>
38 39 #include <trace/events/kvm.h>
39 40  
40 41 #include <kvm/iodev.h>
... ... @@ -140,6 +141,9 @@
140 141 /*
141 142 * It is now safe to release the object's resources
142 143 */
  144 +#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
  145 + irq_bypass_unregister_consumer(&irqfd->consumer);
  146 +#endif
143 147 eventfd_ctx_put(irqfd->eventfd);
144 148 kfree(irqfd);
145 149 }
... ... @@ -391,6 +395,17 @@
391 395 * we might race against the POLLHUP
392 396 */
393 397 fdput(f);
  398 +#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
  399 + irqfd->consumer.token = (void *)irqfd->eventfd;
  400 + irqfd->consumer.add_producer = kvm_arch_irq_bypass_add_producer;
  401 + irqfd->consumer.del_producer = kvm_arch_irq_bypass_del_producer;
  402 + irqfd->consumer.stop = kvm_arch_irq_bypass_stop;
  403 + irqfd->consumer.start = kvm_arch_irq_bypass_start;
  404 + ret = irq_bypass_register_consumer(&irqfd->consumer);
  405 + if (ret)
  406 + pr_info("irq bypass consumer (token %p) registration fails: %d\n",
  407 + irqfd->consumer.token, ret);
  408 +#endif
394 409  
395 410 return 0;
396 411