]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: format intel-iommu,intremap on the command line
authorJán Tomko <jtomko@redhat.com>
Wed, 3 May 2017 13:23:12 +0000 (15:23 +0200)
committerJán Tomko <jtomko@redhat.com>
Mon, 15 May 2017 13:44:11 +0000 (15:44 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=1427005

14 files changed:
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemucapabilitiesdata/caps_2.4.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.5.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.6.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.7.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.8.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
tests/qemuxml2argvdata/qemuxml2argv-intel-iommu-ioapic.args
tests/qemuxml2argvtest.c

index 10c809e8b799ba2ff57e3d4c0d96637426177537..a69119a77f405baf102fca3038c424a2f3eaa8fb 100644 (file)
@@ -369,6 +369,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
 
               "kernel-irqchip", /* 255 */
               "kernel-irqchip.split",
+              "intel-iommu.intremap",
     );
 
 
@@ -1723,6 +1724,10 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsUSBNECXHCI[] = {
     { "p3", QEMU_CAPS_NEC_USB_XHCI_PORTS },
 };
 
+static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIntelIOMMU[] = {
+    { "intremap", QEMU_CAPS_INTEL_IOMMU_INTREMAP },
+};
+
 /* see documentation for virQEMUCapsQMPSchemaGetByPath for the query format */
 static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
     { "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
@@ -1830,6 +1835,9 @@ static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {
     { "nec-usb-xhci", virQEMUCapsObjectPropsUSBNECXHCI,
       ARRAY_CARDINALITY(virQEMUCapsObjectPropsUSBNECXHCI),
       -1 },
+    { "intel-iommu", virQEMUCapsObjectPropsIntelIOMMU,
+      ARRAY_CARDINALITY(virQEMUCapsObjectPropsIntelIOMMU),
+      QEMU_CAPS_DEVICE_INTEL_IOMMU},
 };
 
 struct virQEMUCapsPropTypeObjects {
index 61d3ae2200f1270f2784453dd758a1fe341653c7..2810513fbf1c3a4edc72a8759d180bb58dd9def3 100644 (file)
@@ -407,6 +407,7 @@ typedef enum {
     /* 255 */
     QEMU_CAPS_MACHINE_KERNEL_IRQCHIP, /* -machine kernel_irqchip */
     QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT, /* -machine kernel_irqchip=split */
+    QEMU_CAPS_INTEL_IOMMU_INTREMAP, /* intel-iommu.intremap */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
index 2b235c67296c9b55c09b998872fe58b812e95f6e..f162e0aea2c21f02d9be6b2352e69c743c024436 100644 (file)
@@ -6685,6 +6685,20 @@ qemuBuildIOMMUCommandLine(virCommandPtr cmd,
     if (!iommu)
         return 0;
 
+    switch (iommu->model) {
+    case VIR_DOMAIN_IOMMU_MODEL_INTEL:
+        if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT &&
+            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("iommu: interrupt remapping is not supported "
+                             "with this QEMU binary"));
+            return -1;
+        }
+        break;
+    case VIR_DOMAIN_IOMMU_MODEL_LAST:
+        break;
+    }
+
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU))
         return 0; /* Already handled via -machine */
 
@@ -6705,6 +6719,10 @@ qemuBuildIOMMUCommandLine(virCommandPtr cmd,
             return -1;
         }
         virBufferAddLit(&opts, "intel-iommu");
+        if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT) {
+            virBufferAsprintf(&opts, ",intremap=%s",
+                              virTristateSwitchTypeToString(iommu->intremap));
+        }
     case VIR_DOMAIN_IOMMU_MODEL_LAST:
         break;
     }
index 68221816b82b5c2dce9b3230c442ae12f72c2919..9f256c48a4c5d6047c56d85031f8538f9b999f1b 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "version",
+      "type": "uint32"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "name": "qemu64"
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "events"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
index 2eeed7d6c2ca7a589c6bd8c112cdc50ba7bf4531..876bc2f0a4a322ee8caebeb65b9419923cb200dd 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "version",
+      "type": "uint32"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "name": "qemu64"
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "x-postcopy-ram"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
       "meta-type": "array"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
index 0c285cd951e6445f50fe6bbc687146014e6ef4b5..d6d0b5786d0bbe105990650be38f4107b318cce6 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "version",
+      "type": "uint32"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "name": "qemu64"
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "postcopy-ram"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
       "meta-type": "array"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
index 4a872370b1352808bf15e1fb4887bb43f5e6a335..671a958be65873e2eca4cda46a4bbff1c8174337 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "version",
+      "type": "uint32"
+    },
+    {
+      "name": "intremap",
+      "type": "bool"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "name": "qemu64"
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "postcopy-ram"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
       "meta-type": "object"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
index 6c2ea59c613391a2e5be285f7f5869c762bec4e6..49c046212b3c3385f349b01bac39b6abdc9c14cb 100644 (file)
   <flag name='query-named-block-nodes'/>
   <flag name='kernel-irqchip'/>
   <flag name='kernel-irqchip.split'/>
+  <flag name='intel-iommu.intremap'/>
   <version>2007000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.7.0)</package>
index b3ad9121ec64ef4770cb99fc28a4d0a4de98cddc..3087d768070014b3f609f725822a8feffa7000ec 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "eim",
+      "description": "on/off/auto",
+      "type": "OnOffAuto"
+    },
+    {
+      "name": "x-buggy-eim",
+      "type": "bool"
+    },
+    {
+      "name": "intremap",
+      "type": "bool"
+    },
+    {
+      "name": "version",
+      "type": "uint32"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "static": false
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "x-colo"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
       "meta-type": "object"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
index 9c8c79ab078a0cdd5749770b526541325dbd6395..e51567817e18a812e95156a5b4109cabafe97932 100644 (file)
   <flag name='query-named-block-nodes'/>
   <flag name='kernel-irqchip'/>
   <flag name='kernel-irqchip.split'/>
+  <flag name='intel-iommu.intremap'/>
   <version>2008000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.8.0)</package>
index ca206b3e869d352584a8aba382dcf903cace7922..37fbb6d80e9584de56a255c3203c8e3dfb8701ca 100644 (file)
   "id": "libvirt-40"
 }
 
+{
+  "return": [
+    {
+      "name": "eim",
+      "description": "on/off/auto",
+      "type": "OnOffAuto"
+    },
+    {
+      "name": "caching-mode",
+      "type": "bool"
+    },
+    {
+      "name": "x-buggy-eim",
+      "type": "bool"
+    },
+    {
+      "name": "intremap",
+      "type": "bool"
+    },
+    {
+      "name": "version",
+      "type": "uint32"
+    },
+    {
+      "name": "device-iotlb",
+      "type": "bool"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
 {
   "return": [
     {
       "cpu-max": 255
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
       "migration-safe": true
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
     "tpm-tis"
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "passthrough"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
       "capability": "release-ram"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
       "meta-type": "object"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
       }
     }
   },
-  "id": "libvirt-48"
+  "id": "libvirt-49"
 }
 
 {
       }
     }
   },
-  "id": "libvirt-49"
+  "id": "libvirt-50"
 }
 
 {
index 36126035028427ef9093ceefd25b5ac28b568856..0f273d656e90140dde1a012f3d19b54521b21780 100644 (file)
   <flag name='qemu-xhci'/>
   <flag name='kernel-irqchip'/>
   <flag name='kernel-irqchip.split'/>
+  <flag name='intel-iommu.intremap'/>
   <version>2009000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.9.0)</package>
index 43d71adfcbacfa3c9e4f9428ce7bed770c7a57ec..c6539878ad2b29d7fdbb500a75635dbf90ccde32 100644 (file)
@@ -16,4 +16,4 @@ QEMU_AUDIO_DRV=none \
 -monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
 -no-acpi \
 -boot c \
--device intel-iommu
+-device intel-iommu,intremap=on
index 5bc632f5e6bc11f0b749337ebd38b150e37ed2be..a5544166ba40540ee0cc494b3758d89d16ce9b81 100644 (file)
@@ -2513,6 +2513,7 @@ mymain(void)
             QEMU_CAPS_MACHINE_OPT,
             QEMU_CAPS_MACHINE_KERNEL_IRQCHIP,
             QEMU_CAPS_MACHINE_KERNEL_IRQCHIP_SPLIT,
+            QEMU_CAPS_INTEL_IOMMU_INTREMAP,
             QEMU_CAPS_DEVICE_INTEL_IOMMU);
 
     DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);