From 9541896b8e5bf0d83f0f6e92a9e9298dd0e33d5f Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 13 Jan 2010 18:58:09 +0200 Subject: [PATCH] --- yaml --- r: 179955 b: refs/heads/master c: f1d1c309f35e9b0fb961cffd70fbd04f450ec47c h: refs/heads/master i: 179953: 0cecdaf7b6ca6f9c7fe00bbc8757b366a628bcbd 179951: c6da42976eb0afb0dd25d21739ec30805c91729a v: v3 --- [refs] | 2 +- trunk/virt/kvm/eventfd.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 2708dbcd656a..7171675added 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 82b7005f0e72d8d1a8226e4c192cbb0850d10b3f +refs/heads/master: f1d1c309f35e9b0fb961cffd70fbd04f450ec47c diff --git a/trunk/virt/kvm/eventfd.c b/trunk/virt/kvm/eventfd.c index 30f70fd511c4..62e4cd947a90 100644 --- a/trunk/virt/kvm/eventfd.c +++ b/trunk/virt/kvm/eventfd.c @@ -166,7 +166,7 @@ irqfd_ptable_queue_proc(struct file *file, wait_queue_head_t *wqh, static int kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) { - struct _irqfd *irqfd; + struct _irqfd *irqfd, *tmp; struct file *file = NULL; struct eventfd_ctx *eventfd = NULL; int ret; @@ -203,9 +203,20 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) init_waitqueue_func_entry(&irqfd->wait, irqfd_wakeup); init_poll_funcptr(&irqfd->pt, irqfd_ptable_queue_proc); + spin_lock_irq(&kvm->irqfds.lock); + + ret = 0; + list_for_each_entry(tmp, &kvm->irqfds.items, list) { + if (irqfd->eventfd != tmp->eventfd) + continue; + /* This fd is used for another irq already. */ + ret = -EBUSY; + spin_unlock_irq(&kvm->irqfds.lock); + goto fail; + } + events = file->f_op->poll(file, &irqfd->pt); - spin_lock_irq(&kvm->irqfds.lock); list_add_tail(&irqfd->list, &kvm->irqfds.items); spin_unlock_irq(&kvm->irqfds.lock);