]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: format virtio-related options on the command line
authorJán Tomko <jtomko@redhat.com>
Wed, 24 May 2017 15:09:12 +0000 (17:09 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 8 Jun 2017 14:33:13 +0000 (16:33 +0200)
Format iommu_platform= and ats= for virtio devices.

https://bugzilla.redhat.com/show_bug.cgi?id=1283251

Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
tests/qemuxml2argvdata/qemuxml2argv-virtio-options.args
tests/qemuxml2argvtest.c

index 7da0988bd53939f3c05b949d4897fadfe8e890d2..c0c39bd914b6b7d49527c26a32f927412774c708 100644 (file)
@@ -374,6 +374,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "intel-iommu.eim",
 
               "intel-iommu.device-iotlb", /* 260 */
+              "virtio.iommu_platform",
+              "virtio.ats",
     );
 
 
@@ -1853,7 +1855,7 @@ struct virQEMUCapsPropTypeObjects {
     const char **objects;
 };
 
-static const char *virQEMUCapsVirtioPCIDisableLegacyObjects[] = {
+static const char *virQEMUCapsVirtioPCIObjects[] = {
      "virtio-balloon-pci",
      "virtio-blk-pci",
      "virtio-scsi-pci",
@@ -1872,7 +1874,13 @@ static const char *virQEMUCapsVirtioPCIDisableLegacyObjects[] = {
 static struct virQEMUCapsPropTypeObjects virQEMUCapsPropObjects[] = {
     { "disable-legacy",
       QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY,
-      virQEMUCapsVirtioPCIDisableLegacyObjects }
+      virQEMUCapsVirtioPCIObjects },
+    { "iommu_platform",
+      QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM,
+      virQEMUCapsVirtioPCIObjects },
+    { "ats",
+      QEMU_CAPS_VIRTIO_PCI_ATS,
+      virQEMUCapsVirtioPCIObjects },
 };
 
 
index 275bbcfbe366bb3646964f3b96d0ee0d845655c5..e57cae996a873b04caaa30a419a222cf769f289a 100644 (file)
@@ -413,6 +413,8 @@ typedef enum {
 
     /* 260 */
     QEMU_CAPS_INTEL_IOMMU_DEVICE_IOTLB, /* intel-iommu.device-iotlb */
+    QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM, /* virtio-*-pci.iommu_platform */
+    QEMU_CAPS_VIRTIO_PCI_ATS, /* virtio-*-pci.ats */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
index c6d7e25249439b688a9375810d64cbc3ebdd6e94..20af16b154955cafc34eeb969f560224d891b01c 100644 (file)
@@ -389,6 +389,38 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
     return ret;
 }
 
+static int
+qemuBuildVirtioOptionsStr(virBufferPtr buf,
+                          virDomainVirtioOptionsPtr virtio,
+                          virQEMUCapsPtr qemuCaps)
+{
+    if (!virtio)
+        return 0;
+
+    if (virtio->iommu != VIR_TRISTATE_SWITCH_ABSENT) {
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("the iommu setting is not supported "
+                             "with this QEMU binary"));
+            return -1;
+        }
+        virBufferAsprintf(buf, ",iommu_platform=%s",
+                          virTristateSwitchTypeToString(virtio->iommu));
+    }
+    if (virtio->ats != VIR_TRISTATE_SWITCH_ABSENT) {
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_ATS)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("the ats setting is not supported with this "
+                             "QEMU binary"));
+            return -1;
+        }
+        virBufferAsprintf(buf, ",ats=%s",
+                          virTristateSwitchTypeToString(virtio->ats));
+    }
+
+    return 0;
+}
+
 static int
 qemuBuildRomStr(virBufferPtr buf,
                 virDomainDeviceInfoPtr info)
@@ -2168,6 +2200,10 @@ qemuBuildDriveDevStr(const virDomainDef *def,
                               (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN)
                               ? "on" : "off");
         }
+
+        if (qemuBuildVirtioOptionsStr(&opt, disk->virtio, qemuCaps) < 0)
+            goto error;
+
         if (qemuBuildDeviceAddressStr(&opt, def, &disk->info, qemuCaps) < 0)
             goto error;
         break;
@@ -2491,6 +2527,8 @@ qemuBuildFSDevStr(const virDomainDef *def,
                       QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
     virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
 
+    qemuBuildVirtioOptionsStr(&opt, fs->virtio, qemuCaps);
+
     if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, qemuCaps) < 0)
         goto error;
 
@@ -2735,6 +2773,8 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
                                       def->iothread);
                 }
             }
+            if (qemuBuildVirtioOptionsStr(&buf, def->virtio, qemuCaps) < 0)
+                goto error;
             break;
         case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC:
             virBufferAddLit(&buf, "lsi");
@@ -2780,6 +2820,8 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
             virBufferAsprintf(&buf, ",vectors=%d",
                               def->opts.vioserial.vectors);
         }
+        if (qemuBuildVirtioOptionsStr(&buf, def->virtio, qemuCaps) < 0)
+            goto error;
         break;
 
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
@@ -3774,12 +3816,16 @@ qemuBuildNicDevStr(virDomainDefPtr def,
     virBufferAsprintf(&buf, ",id=%s", net->info.alias);
     virBufferAsprintf(&buf, ",mac=%s",
                       virMacAddrFormat(&net->mac, macaddr));
+
     if (qemuBuildDeviceAddressStr(&buf, def, &net->info, qemuCaps) < 0)
         goto error;
     if (qemuBuildRomStr(&buf, &net->info) < 0)
         goto error;
     if (bootindex && virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
         virBufferAsprintf(&buf, ",bootindex=%u", bootindex);
+    if (usingVirtio &&
+        qemuBuildVirtioOptionsStr(&buf, net->virtio, qemuCaps) < 0)
+        goto error;
 
     if (virBufferCheckError(&buf) < 0)
         goto error;
@@ -4054,6 +4100,9 @@ qemuBuildMemballoonCommandLine(virCommandPtr cmd,
                           virTristateSwitchTypeToString(def->memballoon->autodeflate));
     }
 
+    if (qemuBuildVirtioOptionsStr(&buf, def->memballoon->virtio, qemuCaps) < 0)
+        goto error;
+
     virCommandAddArg(cmd, "-device");
     virCommandAddArgBuffer(cmd, &buf);
     return 0;
@@ -4184,6 +4233,9 @@ qemuBuildVirtioInputDevStr(const virDomainDef *def,
     if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0)
         goto error;
 
+    if (qemuBuildVirtioOptionsStr(&buf, dev->virtio, qemuCaps) < 0)
+        goto error;
+
     if (virBufferCheckError(&buf) < 0)
         goto error;
 
@@ -4496,6 +4548,9 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
     if (qemuBuildDeviceAddressStr(&buf, def, &video->info, qemuCaps) < 0)
         goto error;
 
+    if (qemuBuildVirtioOptionsStr(&buf, video->virtio, qemuCaps) < 0)
+        goto error;
+
     if (virBufferCheckError(&buf) < 0)
         goto error;
 
@@ -5864,6 +5919,9 @@ qemuBuildRNGDevStr(const virDomainDef *def,
             virBufferAddLit(&buf, ",period=1000");
     }
 
+    if (qemuBuildVirtioOptionsStr(&buf, dev->virtio, qemuCaps) < 0)
+        goto error;
+
     if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0)
         goto error;
     if (virBufferCheckError(&buf) < 0)
index d51ee4630a9bee0177258cc7638ea8ba3bf60a5a..58dd9f637495aa232aa41e37777eb2efdb519fbd 100644 (file)
   <flag name='intel-iommu.caching-mode'/>
   <flag name='intel-iommu.eim'/>
   <flag name='intel-iommu.device-iotlb'/>
+  <flag name='virtio.iommu_platform'/>
+  <flag name='virtio.ats'/>
   <version>2009000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.9.0)</package>
index fa123473ad7506b8f208dbdaf2295bd6f6a40451..b53f1ba5cb35b6036dcab92025adbd9ee694ff5b 100644 (file)
@@ -16,26 +16,35 @@ QEMU_AUDIO_DRV=none \
 -monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
 -no-acpi \
 -boot c \
--device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x8 \
--device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x9 \
+-device virtio-scsi-pci,iommu_platform=on,ats=on,id=scsi0,bus=pci.0,addr=0x8 \
+-device virtio-serial-pci,id=virtio-serial0,iommu_platform=on,ats=on,bus=pci.0,\
+addr=0x9 \
 -usb \
 -drive file=/var/lib/libvirt/images/img1,format=raw,if=none,\
 id=drive-virtio-disk0 \
--device virtio-blk-pci,bus=pci.0,addr=0xa,drive=drive-virtio-disk0,\
-id=virtio-disk0 \
+-device virtio-blk-pci,iommu_platform=on,ats=on,bus=pci.0,addr=0xa,\
+drive=drive-virtio-disk0,id=virtio-disk0 \
 -fsdev local,security_model=passthrough,id=fsdev-fs0,path=/export/fs1 \
--device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=fs1,bus=pci.0,addr=0x3 \
+-device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=fs1,iommu_platform=on,\
+ats=on,bus=pci.0,addr=0x3 \
 -fsdev local,security_model=mapped,writeout=immediate,id=fsdev-fs1,\
 path=/export/fs2 \
--device virtio-9p-pci,id=fs1,fsdev=fsdev-fs1,mount_tag=fs2,bus=pci.0,addr=0x4 \
--device virtio-net-pci,vlan=0,id=net0,mac=52:54:56:58:5a:5c,bus=pci.0,addr=0x6 \
+-device virtio-9p-pci,id=fs1,fsdev=fsdev-fs1,mount_tag=fs2,iommu_platform=on,\
+ats=on,bus=pci.0,addr=0x4 \
+-device virtio-net-pci,vlan=0,id=net0,mac=52:54:56:58:5a:5c,bus=pci.0,addr=0x6,\
+iommu_platform=on,ats=on \
 -net user,vlan=0,name=hostnet0 \
--device virtio-mouse-pci,id=input0,bus=pci.0,addr=0xe \
--device virtio-keyboard-pci,id=input1,bus=pci.0,addr=0x10 \
--device virtio-tablet-pci,id=input2,bus=pci.0,addr=0x11 \
+-device virtio-mouse-pci,id=input0,bus=pci.0,addr=0xe,iommu_platform=on,ats=on \
+-device virtio-keyboard-pci,id=input1,bus=pci.0,addr=0x10,iommu_platform=on,\
+ats=on \
+-device virtio-tablet-pci,id=input2,bus=pci.0,addr=0x11,iommu_platform=on,\
+ats=on \
 -device virtio-input-host-pci,id=input3,evdev=/dev/input/event1234,bus=pci.0,\
-addr=0x12 \
--device virtio-gpu-pci,id=video0,virgl=on,bus=pci.0,addr=0x2 \
--device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0xc \
+addr=0x12,iommu_platform=on,ats=on \
+-device virtio-gpu-pci,id=video0,virgl=on,bus=pci.0,addr=0x2,iommu_platform=on,\
+ats=on \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0xc,iommu_platform=on,\
+ats=on \
 -object rng-random,id=objrng0,filename=/dev/random \
--device virtio-rng-pci,rng=objrng0,id=rng0,bus=pci.0,addr=0xd
+-device virtio-rng-pci,rng=objrng0,id=rng0,iommu_platform=on,ats=on,bus=pci.0,\
+addr=0xd
index 609ea1e313560bb23e679ad80a135de72f9f89ad..b410b20e5a0c9aaee5e2239373f8b70cdb1959ca 100644 (file)
@@ -2553,7 +2553,9 @@ mymain(void)
             QEMU_CAPS_VIRTIO_GPU_VIRGL,
             QEMU_CAPS_DEVICE_VIRTIO_RNG,
             QEMU_CAPS_OBJECT_RNG_RANDOM,
-            QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
+            QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
+            QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM,
+            QEMU_CAPS_VIRTIO_PCI_ATS);
 
     DO_TEST("fd-memory-numa-topology", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
             QEMU_CAPS_KVM);