lkml.org 
[lkml]   [2015]   [Jul]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC 16/17] KVM: eventfd: add irq bypass consumer management
    Date
    This patch adds the registration/unregistration of an
    irq_bypass_consumer on irqfd assignment/deassignment.

    Signed-off-by: Eric Auger <eric.auger@linaro.org>
    ---
    virt/kvm/eventfd.c | 22 +++++++++++++++++++---
    1 file changed, 19 insertions(+), 3 deletions(-)

    diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
    index f3da161..425a47b 100644
    --- a/virt/kvm/eventfd.c
    +++ b/virt/kvm/eventfd.c
    @@ -34,6 +34,7 @@
    #include <linux/srcu.h>
    #include <linux/slab.h>
    #include <linux/seqlock.h>
    +#include <linux/irqbypass.h>
    #include <trace/events/kvm.h>

    #include <kvm/iodev.h>
    @@ -93,6 +94,7 @@ struct _irqfd {
    struct list_head list;
    poll_table pt;
    struct work_struct shutdown;
    + struct irq_bypass_consumer *cons;
    };

    static struct workqueue_struct *irqfd_cleanup_wq;
    @@ -429,7 +431,21 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
    */
    fdput(f);

    - /* irq_bypass_register_consumer(); */
    + irqfd->cons = kzalloc(sizeof(struct irq_bypass_consumer),
    + GFP_KERNEL);
    + if (!irqfd->cons) {
    + ret = -ENOMEM;
    + goto fail;
    + }
    + irqfd->cons->token = (void *)irqfd->eventfd;
    + irqfd->cons->gsi = irqfd->gsi;
    + irqfd->cons->kvm = kvm;
    + irqfd->cons->add_producer = kvm_arch_add_producer;
    + irqfd->cons->del_producer = kvm_arch_del_producer;
    + irqfd->cons->stop_consumer = kvm_arch_stop_consumer;
    + irqfd->cons->resume_consumer = kvm_arch_resume_consumer;
    + ret = irq_bypass_register_consumer(irqfd->cons);
    + WARN_ON(ret);

    return 0;

    @@ -530,8 +546,6 @@ kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args)
    struct _irqfd *irqfd, *tmp;
    struct eventfd_ctx *eventfd;

    - /* irq_bypass_unregister_consumer() */
    -
    eventfd = eventfd_ctx_fdget(args->fd);
    if (IS_ERR(eventfd))
    return PTR_ERR(eventfd);
    @@ -550,6 +564,8 @@ kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args)
    irqfd->irq_entry.type = 0;
    write_seqcount_end(&irqfd->irq_entry_sc);
    irqfd_deactivate(irqfd);
    + irq_bypass_unregister_consumer(irqfd->cons);
    + kfree(irqfd->cons);
    }
    }

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-07-02 15:41    [W:4.053 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site