qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] intel_iommu: check misordered init when realize
@ 2017-03-02  3:32 Peter Xu
  2017-03-02  5:13 ` Michael S. Tsirkin
  0 siblings, 1 reply; 11+ messages in thread
From: Peter Xu @ 2017-03-02  3:32 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, yi.l.liu, Marcel Apfelbaum, Jintack Lim,
	\  Michael S . Tsirkin \ , peterx, Jason Wang, Alex Williamson

Intel vIOMMU devices are created with "-device" parameter, while here
actually we need to make sure the dmar device be created before other
PCI devices (like vfio-pci, virtio-pci ones) so that we know iommu_fn
will be setup correctly before realizations of those PCI devices (it is
legal that PCI device fetch these info during its realization). Now this
ordering yet cannot be achieved elsewhere, and devices will be created
in the order that user specified. We need to avoid that.

This patch tries to detect this kind of misordering issue during init of
VT-d device, then report to guest if misordering happened. In the
future, we can provide something better to solve it, e.g., to support
device init ordering, then we can live without this patch.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
v3: added virtio-pci device detection since we have that requirement as
    well now.

PS. this patch should be needed along with Jason's:
 "virtio: unbreak virtio-pci with IOMMU after caching ring translations"
to make sure virtio devices with vt-d are safe for 2.9.
---
 hw/i386/intel_iommu.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 22d8226..1077f90 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -2560,6 +2560,24 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
     return true;
 }
 
+/*
+ * TODO: we should have a better way to achieve the ordering rather
+ * than this misorder check explicitly against vfio-pci and virtio-pci
+ * devices. Here, there's no easy way to detect init of virtio-pci
+ * devices, instead we detect the virtio bus.
+ */
+static bool vtd_detected_misorder_init(Error **errp)
+{
+    if (object_resolve_path_type("", "vfio-pci", NULL) ||
+        object_resolve_path_type("", "virtio-pci-bus", NULL)) {
+        error_setg(errp, "Please specify \"intel-iommu\" before "
+                   "all the rest of the devices.");
+        return true;
+    }
+
+    return false;
+}
+
 static void vtd_realize(DeviceState *dev, Error **errp)
 {
     PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
@@ -2567,6 +2585,10 @@ static void vtd_realize(DeviceState *dev, Error **errp)
     IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
     X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
 
+    if (vtd_detected_misorder_init(errp)) {
+        return;
+    }
+
     VTD_DPRINTF(GENERAL, "");
     x86_iommu->type = TYPE_INTEL;
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-03-10  7:04 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-02  3:32 [Qemu-devel] [PATCH v3] intel_iommu: check misordered init when realize Peter Xu
2017-03-02  5:13 ` Michael S. Tsirkin
2017-03-02  5:20   ` Peter Xu
2017-03-02  5:28     ` Michael S. Tsirkin
2017-03-02  6:24   ` Marcel Apfelbaum
2017-03-08  8:35     ` Paolo Bonzini
2017-03-08  8:59       ` Peter Xu
2017-03-08  9:25         ` Gerd Hoffmann
2017-03-10  7:04           ` Peter Xu
2017-03-08 10:08       ` Jason Wang
2017-03-08 13:20         ` Marcel Apfelbaum

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).