From: Sheng Yang <sheng@linux.intel.com>
To: Avi Kivity <avi@redhat.com>
Cc: kvm@vger.kernel.org, Sheng Yang <sheng@linux.intel.com>
Subject: [PATCH 1/4] KVM: Using kfifo for irq recording
Date: Tue, 23 Dec 2008 16:12:50 +0800 [thread overview]
Message-ID: <1230019973-16833-2-git-send-email-sheng@linux.intel.com> (raw)
In-Reply-To: <1230019973-16833-1-git-send-email-sheng@linux.intel.com>
For MSI-X, we have to deal with multiply IRQ with same IRQ handler, so it's
necessary to record the IRQ that trigger the IRQ handler.
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
include/linux/kvm_host.h | 4 ++++
virt/kvm/kvm_main.c | 30 +++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 5b671b6..541ccaf 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -17,6 +17,7 @@
#include <linux/preempt.h>
#include <linux/marker.h>
#include <linux/msi.h>
+#include <linux/kfifo.h>
#include <asm/signal.h>
#include <linux/kvm.h>
@@ -313,6 +314,9 @@ struct kvm_assigned_dev_kernel {
int host_irq;
bool host_irq_disabled;
int guest_irq;
+#define KVM_ASSIGNED_DEV_IRQ_FIFO_LEN 0x100
+ struct kfifo *irq_fifo;
+ spinlock_t irq_fifo_lock;
#define KVM_ASSIGNED_DEV_GUEST_INTX (1 << 0)
#define KVM_ASSIGNED_DEV_GUEST_MSI (1 << 1)
#define KVM_ASSIGNED_DEV_HOST_INTX (1 << 8)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index e39c57a..3955e4d 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -99,6 +99,8 @@ static struct kvm_assigned_dev_kernel *kvm_find_assigned_dev(struct list_head *h
static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
{
struct kvm_assigned_dev_kernel *assigned_dev;
+ int irq;
+ u32 gsi;
assigned_dev = container_of(work, struct kvm_assigned_dev_kernel,
interrupt_work);
@@ -109,14 +111,22 @@ static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
*/
mutex_lock(&assigned_dev->kvm->lock);
- kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
- assigned_dev->guest_irq, 1);
+handle_irq:
+ kfifo_get(assigned_dev->irq_fifo,
+ (unsigned char *)&irq, sizeof(int));
+
+ gsi = assigned_dev->guest_irq;
+
+ kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id, gsi, 1);
if (assigned_dev->irq_requested_type & KVM_ASSIGNED_DEV_GUEST_MSI) {
enable_irq(assigned_dev->host_irq);
assigned_dev->host_irq_disabled = false;
}
+ if (kfifo_len(assigned_dev->irq_fifo) != 0)
+ goto handle_irq;
+
mutex_unlock(&assigned_dev->kvm->lock);
kvm_put_kvm(assigned_dev->kvm);
}
@@ -128,6 +138,9 @@ static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id)
kvm_get_kvm(assigned_dev->kvm);
+ kfifo_put(assigned_dev->irq_fifo,
+ (unsigned char *)&irq, sizeof(int));
+
schedule_work(&assigned_dev->interrupt_work);
disable_irq_nosync(irq);
@@ -201,6 +214,7 @@ static void kvm_free_assigned_device(struct kvm *kvm,
pci_dev_put(assigned_dev->dev);
list_del(&assigned_dev->list);
+ kfifo_free(assigned_dev->irq_fifo);
kfree(assigned_dev);
}
@@ -449,15 +463,25 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,
list_add(&match->list, &kvm->arch.assigned_dev_head);
+ spin_lock_init(&match->irq_fifo_lock);
+ match->irq_fifo = kfifo_alloc(sizeof(unsigned char) *
+ KVM_ASSIGNED_DEV_IRQ_FIFO_LEN,
+ GFP_KERNEL | __GFP_ZERO,
+ &match->irq_fifo_lock);
+ if (!match->irq_fifo)
+ goto out_list_del;
+
if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) {
r = kvm_iommu_map_guest(kvm, match);
if (r)
- goto out_list_del;
+ goto out_fifo_del;
}
out:
mutex_unlock(&kvm->lock);
return r;
+out_fifo_del:
+ kfifo_free(match->irq_fifo);
out_list_del:
list_del(&match->list);
pci_release_regions(dev);
--
1.5.4.5
next prev parent reply other threads:[~2008-12-23 8:12 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-23 8:12 [PATCH 0/4] MSI-X Enabling Sheng Yang
2008-12-23 8:12 ` Sheng Yang [this message]
2008-12-25 11:07 ` [PATCH 1/4] KVM: Using kfifo for irq recording Avi Kivity
2008-12-25 11:27 ` Sheng Yang
2008-12-25 13:26 ` Avi Kivity
2008-12-26 1:53 ` Sheng Yang
2008-12-23 8:12 ` [PATCH 2/4] KVM: Add intercepted MMIO for KVM Sheng Yang
2008-12-23 8:12 ` [PATCH 3/4] KVM: x86: displace MMIO handling part Sheng Yang
2008-12-23 8:12 ` [PATCH 4/4] KVM: Enable MSI-X for KVM assigned device Sheng Yang
2008-12-23 20:19 ` [PATCH 0/4] MSI-X Enabling Marcelo Tosatti
2008-12-24 3:00 ` Sheng Yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1230019973-16833-2-git-send-email-sheng@linux.intel.com \
--to=sheng@linux.intel.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.