qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Auger <eric.auger@linaro.org>
To: eric.auger@st.com, christoffer.dall@linaro.org,
	qemu-devel@nongnu.org, kim.phillips@freescale.com,
	a.rigo@virtualopensystems.com
Cc: peter.maydell@linaro.org, eric.auger@linaro.org,
	patches@linaro.org, will.deacon@arm.com, agraf@suse.de,
	stuart.yoder@freescale.com, Bharat.Bhushan@freescale.com,
	alex.williamson@redhat.com, joel.schopp@amd.com,
	a.motakis@virtualopensystems.com, kvmarm@lists.cs.columbia.edu
Subject: [Qemu-devel] [PATCH v5 09/10] hw/vfio/platform: Add irqfd support
Date: Sat,  9 Aug 2014 15:25:48 +0100	[thread overview]
Message-ID: <1407594349-9291-10-git-send-email-eric.auger@linaro.org> (raw)
In-Reply-To: <1407594349-9291-1-git-send-email-eric.auger@linaro.org>

This patch aims at optimizing IRQ handling using irqfd framework.

Instead of handling the eventfds on user-side they are handled on
kernel side using
- the KVM irqfd framework,
- the VFIO driver virqfd framework.

the virtual IRQ completion is trapped at interrupt controller
instead of on guest 1st access to any region after IRQ hit.
This removes the need for fast/slow path swap.

Overall this brings significant performance improvements.

It depends on host kernel KVM irqfd/GSI routing capability.

Signed-off-by: Alvise Rigo <a.rigo@virtualopensystems.com>
Signed-off-by: Eric Auger <eric.auger@linaro.org>

---
v4 -> v5:
- addition of sysemu/kvm.h header

v3 -> v4:
[Alvise Rigo]
Use of VFIO Platform driver v6 unmask/virqfd feature and removal
of resamplefd handler. Physical IRQ unmasking is now done in
VFIO driver.

v3:
[Eric Auger]
initial support with resamplefd handled on QEMU side since the
unmask was not supported on VFIO platform driver v5.
---
 hw/vfio/platform.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)

diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index f1a1b55..e5c652c 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -23,6 +23,7 @@
 #include "exec/memory.h"
 #include "qemu/queue.h"
 #include "hw/sysbus.h"
+#include "sysemu/kvm.h"
 
 extern const MemoryRegionOps vfio_region_ops;
 extern const MemoryListener vfio_memory_listener;
@@ -367,6 +368,99 @@ static int vfio_populate_interrupts(VFIODevice *vbasedev)
     return 0;
 }
 
+static void vfio_enable_intp_kvm(VFIOINTp *intp)
+{
+#ifdef CONFIG_KVM
+    struct kvm_irqfd irqfd = {
+        .fd = event_notifier_get_fd(&intp->interrupt),
+        .gsi = intp->virtualID,
+        .flags = KVM_IRQFD_FLAG_RESAMPLE,
+    };
+
+    struct vfio_irq_set *irq_set;
+    int ret, argsz;
+    int32_t *pfd;
+    VFIODevice *vbasedev = &intp->vdev->vbasedev;
+
+    if (!kvm_irqfds_enabled() ||
+        !kvm_check_extension(kvm_state, KVM_CAP_IRQFD_RESAMPLE)) {
+        return;
+    }
+
+    /* Get to a known interrupt state */
+    qemu_set_fd_handler(irqfd.fd, NULL, NULL, NULL);
+    vfio_mask_irqindex(vbasedev, intp->pin);
+    intp->state = VFIO_IRQ_INACTIVE;
+    qemu_set_irq(intp->qemuirq, 0);
+
+    /* Get an eventfd for resample/unmask */
+    if (event_notifier_init(&intp->unmask, 0)) {
+        error_report("vfio: Error: event_notifier_init failed eoi");
+        goto fail;
+    }
+
+    /* KVM triggers it, VFIO listens for it */
+    irqfd.resamplefd = event_notifier_get_fd(&intp->unmask);
+
+    if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, &irqfd)) {
+        error_report("vfio: Error: Failed to setup resample irqfd: %m");
+        goto fail_irqfd;
+    }
+
+    argsz = sizeof(*irq_set) + sizeof(*pfd);
+
+    irq_set = g_malloc0(argsz);
+    irq_set->argsz = argsz;
+    irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_UNMASK;
+    irq_set->index = intp->pin;
+    irq_set->start = 0;
+    irq_set->count = 1;
+    pfd = (int32_t *)&irq_set->data;
+
+    *pfd = irqfd.resamplefd;
+
+    ret = ioctl(vbasedev->fd, VFIO_DEVICE_SET_IRQS, irq_set);
+    g_free(irq_set);
+    if (ret) {
+        error_report("vfio: Error: Failed to setup IRQ unmask fd: %m");
+        goto fail_vfio;
+    }
+
+    vfio_unmask_irqindex(vbasedev, intp->pin);
+
+    intp->kvm_accel = true;
+
+    DPRINTF("%s irqfd pin=%d to virtID = %d fd=%d, resamplefd=%d)\n",
+            __func__, intp->pin, intp->virtualID,
+            irqfd.fd, irqfd.resamplefd);
+    return;
+
+fail_vfio:
+    irqfd.flags = KVM_IRQFD_FLAG_DEASSIGN;
+    kvm_vm_ioctl(kvm_state, KVM_IRQFD, &irqfd);
+fail_irqfd:
+    event_notifier_cleanup(&intp->unmask);
+fail:
+    qemu_set_fd_handler(irqfd.fd, vfio_intp_interrupt, NULL, intp);
+    vfio_unmask_irqindex(vbasedev, intp->pin);
+#endif
+}
+
+void vfio_setup_irqfd(SysBusDevice *s, int index, int virq)
+{
+    VFIOPlatformDevice *vdev = container_of(s, VFIOPlatformDevice, sbdev);
+    VFIOINTp *intp;
+
+    QLIST_FOREACH(intp, &vdev->intp_list, next) {
+        if (intp->pin == index) {
+            intp->virtualID = virq;
+            DPRINTF("enable irqfd for irq index %d (virtual IRQ %d)\n",
+                    index, virq);
+            vfio_enable_intp_kvm(intp);
+        }
+    }
+}
+
 static VFIODeviceOps vfio_platform_ops = {
     .vfio_compute_needs_reset = vfio_platform_compute_needs_reset,
     .vfio_hot_reset_multi = vfio_platform_hot_reset_multi,
-- 
1.8.3.2

  parent reply	other threads:[~2014-08-09 14:26 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-09 14:25 [Qemu-devel] [PATCH v5 00/10] KVM platform device passthrough Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 01/10] vfio: move hw/misc/vfio.c to hw/vfio/pci.c Move vfio.h into include/hw/vfio Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 02/10] hw/vfio/pci: Rename VFIODevice into VFIOPCIDevice Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 03/10] hw/vfio/pci: introduce VFIODevice Eric Auger
2014-08-12  2:34   ` David Gibson
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 04/10] hw/vfio/pci: Introduce VFIORegion Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 05/10] hw/vfio/pci: split vfio_get_device Eric Auger
2014-08-12  2:41   ` David Gibson
2014-08-12  6:54     ` Eric Auger
2014-08-13  3:32       ` David Gibson
2014-08-29 10:00         ` Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 06/10] hw/vfio: create common module Eric Auger
2014-08-11 19:20   ` Alex Williamson
2014-08-12  5:57     ` Eric Auger
2014-08-11 19:25   ` Alex Williamson
2014-08-12  6:09     ` Eric Auger
2014-08-13 19:59       ` Alex Williamson
2014-09-01 16:31         ` Eric Auger
2014-09-01 17:41           ` Alexander Graf
2014-09-02  7:13             ` Eric Auger
2014-09-02 21:13               ` Alex Williamson
2014-08-20 19:12   ` Joel Schopp
2014-08-20 19:41     ` Alex Williamson
2014-08-20 20:08       ` Joel Schopp
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 07/10] hw/vfio/platform: add vfio-platform support Eric Auger
2014-08-11  9:36   ` Alexander Graf
2014-08-12  7:59     ` Bharat.Bhushan
2014-08-12 16:34       ` Eric Auger
2014-08-11 20:13   ` Alex Williamson
2014-08-12  5:51     ` Eric Auger
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 08/10] hw/intc/arm_gic_kvm: advertise irqfd Eric Auger
2014-08-11  9:37   ` Alexander Graf
2014-08-11 12:04     ` Eric Auger
2014-08-11 12:05       ` Alexander Graf
2014-08-11 12:27         ` Eric Auger
2014-08-11 12:29           ` Alexander Graf
2014-08-09 14:25 ` Eric Auger [this message]
2014-08-09 14:25 ` [Qemu-devel] [PATCH v5 10/10] hw/arm/dyn_sysbus_devtree: enable simple VFIO dynamic instantiation Eric Auger
2014-08-11  9:40   ` Alexander Graf
2014-08-11 11:55     ` Eric Auger
2014-08-18 21:54   ` Joel Schopp
2014-08-18 22:11     ` Peter Maydell
2014-08-18 22:26       ` Joel Schopp
2014-08-19  7:32         ` Eric Auger
2014-08-19 10:59         ` Alexander Graf
2014-08-19 14:15           ` Joel Schopp
2014-08-19 14:29             ` Alexander Graf
2014-08-19  7:24       ` Eric Auger
2014-08-19  8:17         ` Peter Maydell
2014-08-19  6:59     ` Eric Auger

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=1407594349-9291-10-git-send-email-eric.auger@linaro.org \
    --to=eric.auger@linaro.org \
    --cc=Bharat.Bhushan@freescale.com \
    --cc=a.motakis@virtualopensystems.com \
    --cc=a.rigo@virtualopensystems.com \
    --cc=agraf@suse.de \
    --cc=alex.williamson@redhat.com \
    --cc=christoffer.dall@linaro.org \
    --cc=eric.auger@st.com \
    --cc=joel.schopp@amd.com \
    --cc=kim.phillips@freescale.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=patches@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stuart.yoder@freescale.com \
    --cc=will.deacon@arm.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).