qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Peter Xu <peterx@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] [PULL v4 26/57] ioapic: register IOMMU IEC notifier for ioapic
Date: Thu, 21 Jul 2016 19:28:07 +0300	[thread overview]
Message-ID: <1469118288-4776-27-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1469118288-4776-1-git-send-email-mst@redhat.com>

From: Peter Xu <peterx@redhat.com>

Let IOAPIC the first consumer of x86 IOMMU IEC invalidation
notifiers. This is only used for split irqchip case, when vIOMMU
receives IR invalidation requests, IOAPIC will be notified to update
kernel irq routes. For simplicity, we just update all IOAPIC routes,
even if the invalidated entries are not IOAPIC ones.

Since now we are creating IOMMUs using "-device" parameter, IOMMU
device will be created after IOAPIC.  We need to do the registration
after machine done by leveraging machine_done notifier.

Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/i386/ioapic_internal.h |  2 ++
 hw/intc/ioapic.c                  | 31 +++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
index 5c901ae..d89ea1b 100644
--- a/include/hw/i386/ioapic_internal.h
+++ b/include/hw/i386/ioapic_internal.h
@@ -25,6 +25,7 @@
 #include "hw/hw.h"
 #include "exec/memory.h"
 #include "hw/sysbus.h"
+#include "qemu/notify.h"
 
 #define MAX_IOAPICS                     1
 
@@ -107,6 +108,7 @@ struct IOAPICCommonState {
     uint8_t ioregsel;
     uint32_t irr;
     uint64_t ioredtbl[IOAPIC_NUM_PINS];
+    Notifier machine_done;
 };
 
 void ioapic_reset_common(DeviceState *dev);
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index cfc7b7b..2d3282a 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -31,6 +31,7 @@
 #include "sysemu/kvm.h"
 #include "target-i386/cpu.h"
 #include "hw/i386/apic-msidef.h"
+#include "hw/i386/x86-iommu.h"
 
 //#define DEBUG_IOAPIC
 
@@ -198,6 +199,16 @@ static void ioapic_update_kvm_routes(IOAPICCommonState *s)
 #endif
 }
 
+#ifdef CONFIG_KVM
+static void ioapic_iec_notifier(void *private, bool global,
+                                uint32_t index, uint32_t mask)
+{
+    IOAPICCommonState *s = (IOAPICCommonState *)private;
+    /* For simplicity, we just update all the routes */
+    ioapic_update_kvm_routes(s);
+}
+#endif
+
 void ioapic_eoi_broadcast(int vector)
 {
     IOAPICCommonState *s;
@@ -354,6 +365,24 @@ static const MemoryRegionOps ioapic_io_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
+static void ioapic_machine_done_notify(Notifier *notifier, void *data)
+{
+#ifdef CONFIG_KVM
+    IOAPICCommonState *s = container_of(notifier, IOAPICCommonState,
+                                        machine_done);
+
+    if (kvm_irqchip_is_split()) {
+        X86IOMMUState *iommu = x86_iommu_get_default();
+        if (iommu) {
+            /* Register this IOAPIC with IOMMU IEC notifier, so that
+             * when there are IR invalidates, we can be notified to
+             * update kernel IR cache. */
+            x86_iommu_iec_register_notifier(iommu, ioapic_iec_notifier, s);
+        }
+    }
+#endif
+}
+
 static void ioapic_realize(DeviceState *dev, Error **errp)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
@@ -364,6 +393,8 @@ static void ioapic_realize(DeviceState *dev, Error **errp)
     qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
 
     ioapics[ioapic_no] = s;
+    s->machine_done.notify = ioapic_machine_done_notify;
+    qemu_add_machine_init_done_notifier(&s->machine_done);
 }
 
 static void ioapic_class_init(ObjectClass *klass, void *data)
-- 
MST

  parent reply	other threads:[~2016-07-21 16:28 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-21 16:26 [Qemu-devel] [PULL v4 00/57] pc, pci, virtio: new features, cleanups, fixes Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 01/57] nvdimm: fix memory leak in error code path Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 02/57] tests/prom-env-test: increase the test timeout Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 03/57] hw/alpha: fix PCI bus initialization Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 04/57] hw/mips: " Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 05/57] hw/apb: " Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 06/57] hw/grackle: " Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 07/57] hw/prep: realize the PCI root bus as part of the prep init Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 08/57] hw/versatile: realize the PCI root bus as part of the versatile init Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 09/57] x86-iommu: introduce parent class Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 10/57] intel_iommu: rename VTD_PCI_DEVFN_MAX to x86-iommu Michael S. Tsirkin
2016-07-21 16:26 ` [Qemu-devel] [PULL v4 11/57] x86-iommu: provide x86_iommu_get_default Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 12/57] x86-iommu: introduce "intremap" property Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 13/57] acpi: enable INTR for DMAR report structure Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 14/57] intel_iommu: allow queued invalidation for IR Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 15/57] intel_iommu: set IR bit for ECAP register Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 16/57] acpi: add DMAR scope definition for root IOAPIC Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 17/57] intel_iommu: define interrupt remap table addr register Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 18/57] intel_iommu: handle interrupt remap enable Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 19/57] intel_iommu: define several structs for IOMMU IR Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 20/57] intel_iommu: add IR translation faults defines Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 21/57] intel_iommu: Add support for PCI MSI remap Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 22/57] q35: ioapic: add support for emulated IOAPIC IR Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 23/57] ioapic: introduce ioapic_entry_parse() helper Michael S. Tsirkin
2016-07-21 16:27 ` [Qemu-devel] [PULL v4 24/57] intel_iommu: add support for split irqchip Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 25/57] x86-iommu: introduce IEC notifiers Michael S. Tsirkin
2016-07-21 16:28 ` Michael S. Tsirkin [this message]
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 27/57] intel_iommu: Add support for Extended Interrupt Mode Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 28/57] intel_iommu: add SID validation for IR Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 29/57] kvm-irqchip: simplify kvm_irqchip_add_msi_route Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 30/57] kvm-irqchip: i386: add hook for add/remove virq Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 31/57] kvm-irqchip: x86: add msi route notify fn Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 32/57] kvm-irqchip: do explicit commit when update irq Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 33/57] intel_iommu: support all masks in interrupt entry cache invalidation Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 34/57] kvm-all: add trace events for kvm irqchip ops Michael S. Tsirkin
2016-07-21 16:28 ` [Qemu-devel] [PULL v4 35/57] intel_iommu: disallow kernel-irqchip=on with IR Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 36/57] virtio: Add typedef for handle_output Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 37/57] virtio: Introduce virtio_add_queue_aio Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 38/57] virtio-blk: Call virtio_add_queue_aio Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 39/57] virtio-scsi: " Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 40/57] Revert "mirror: Workaround for unexpected iohandler events during completion" Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 41/57] virtio-scsi: Replace HandleOutput typedef Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 42/57] virtio-net: Remove old migration version support Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 43/57] virtio-serial: " Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 44/57] virtio: Migration helper function and macro Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 45/57] virtio-scsi: Wrap in vmstate Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 46/57] virtio-blk: " Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 47/57] virtio-rng: " Michael S. Tsirkin
2016-07-21 16:29 ` [Qemu-devel] [PULL v4 48/57] virtio-balloon: " Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 49/57] virtio-net: " Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 50/57] virtio-serial: " Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 51/57] 9pfs: " Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 52/57] virtio-input: " Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 53/57] virtio-gpu: Use migrate_add_blocker for virgl migration blocking Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 54/57] virtio-gpu: Wrap in vmstate Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 55/57] virtio: Update migration docs Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 56/57] intel_iommu: get rid of {0} initializers Michael S. Tsirkin
2016-07-21 16:30 ` [Qemu-devel] [PULL v4 57/57] intel_iommu: avoid unnamed fields Michael S. Tsirkin
2016-07-21 17:23 ` [Qemu-devel] [PULL v4 00/57] pc, pci, virtio: new features, cleanups, fixes Peter Maydell

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=1469118288-4776-27-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.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 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).