Skip to content

Commit 9016cfb

Browse files
Eric Augerbonzini
authored andcommitted
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 <[email protected]> Signed-off-by: Feng Wu <[email protected]> Reviewed-by: Alex Williamson <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 1a02b27 commit 9016cfb

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

include/linux/kvm_irqfd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ struct kvm_kernel_irqfd {
6464
struct list_head list;
6565
poll_table pt;
6666
struct work_struct shutdown;
67+
struct irq_bypass_consumer consumer;
68+
struct irq_bypass_producer *producer;
6769
};
6870

6971
#endif /* __LINUX_KVM_IRQFD_H */

virt/kvm/eventfd.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <linux/srcu.h>
3636
#include <linux/slab.h>
3737
#include <linux/seqlock.h>
38+
#include <linux/irqbypass.h>
3839
#include <trace/events/kvm.h>
3940

4041
#include <kvm/iodev.h>
@@ -140,6 +141,9 @@ irqfd_shutdown(struct work_struct *work)
140141
/*
141142
* It is now safe to release the object's resources
142143
*/
144+
#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
145+
irq_bypass_unregister_consumer(&irqfd->consumer);
146+
#endif
143147
eventfd_ctx_put(irqfd->eventfd);
144148
kfree(irqfd);
145149
}
@@ -391,6 +395,17 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
391395
* we might race against the POLLHUP
392396
*/
393397
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
394409

395410
return 0;
396411

0 commit comments

Comments
 (0)