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 v3 26/55] ioapic: register IOMMU IEC notifier for ioapic
Date: Wed, 20 Jul 2016 20:46:38 +0300	[thread overview]
Message-ID: <1469036440-4562-27-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1469036440-4562-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-20 17:46 UTC|newest]

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

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=1469036440-4562-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).