mirror of https://gitee.com/openkylin/libvirt.git
qemu: fix command line building for iommu devices
The intel-iommu device has existed since QEMU 2.2.0, but it was only possible to create it with -device since QEMU 2.7.0, thanks to: commit 621d983a1f9051f4cfc3f402569b46b77d8449fc Author: Marcel Apfelbaum <marcel@redhat.com> Date: Mon Jun 27 18:38:34 2016 +0300 hw/iommu: enable iommu with -device Use the standard '-device intel-iommu' to create the IOMMU device. The legacy '-machine,iommu=on' can still be used. The libvirt capability check & command line formatting code is thus broken for all QEMU versions 2.2.0 -> 2.6.0 inclusive. This fixes it to use iommu=on instead. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
6da7404cc7
commit
5dee668632
|
@ -344,6 +344,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
|
|||
"query-hotpluggable-cpus",
|
||||
|
||||
"virtio-net.rx_queue_size", /* 235 */
|
||||
"machine-iommu",
|
||||
);
|
||||
|
||||
|
||||
|
@ -3804,6 +3805,17 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
|
|||
if (virQEMUCapsProbeQMPMigrationCapabilities(qemuCaps, mon) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* 'intel-iommu' shows up as a device since 2.2.0, but can
|
||||
* not be used with -device until 2.7.0. Before that it
|
||||
* requires -machine iommu=on. So we must clear the device
|
||||
* capability we detected on older QEMUs
|
||||
*/
|
||||
if (qemuCaps->version < 2007000 &&
|
||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU)) {
|
||||
virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU);
|
||||
virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU);
|
||||
}
|
||||
|
||||
/* GIC capabilities, eg. available GIC versions */
|
||||
if ((qemuCaps->arch == VIR_ARCH_AARCH64 ||
|
||||
qemuCaps->arch == VIR_ARCH_ARMV7L) &&
|
||||
|
|
|
@ -378,6 +378,7 @@ typedef enum {
|
|||
|
||||
/* 235 */
|
||||
QEMU_CAPS_VIRTIO_NET_RX_QUEUE_SIZE, /* virtio-net-*.rx_queue_size */
|
||||
QEMU_CAPS_MACHINE_IOMMU, /* -machine iommu=on */
|
||||
|
||||
QEMU_CAPS_LAST /* this must always be the last item */
|
||||
} virQEMUCapsFlags;
|
||||
|
|
|
@ -6414,6 +6414,9 @@ qemuBuildIOMMUCommandLine(virCommandPtr cmd,
|
|||
if (!def->iommu)
|
||||
return 0;
|
||||
|
||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU))
|
||||
return 0; /* Already handled via -machine */
|
||||
|
||||
switch (def->iommu->model) {
|
||||
case VIR_DOMAIN_IOMMU_MODEL_INTEL:
|
||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU)) {
|
||||
|
@ -7044,6 +7047,25 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
|
|||
}
|
||||
}
|
||||
|
||||
/* We don't report errors on missing cap here - -device code will do that */
|
||||
if (def->iommu &&
|
||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) {
|
||||
switch (def->iommu->model) {
|
||||
case VIR_DOMAIN_IOMMU_MODEL_INTEL:
|
||||
if (!qemuDomainMachineIsQ35(def)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("IOMMU device: '%s' is only supported with "
|
||||
"Q35 machines"),
|
||||
virDomainIOMMUModelTypeToString(def->iommu->model));
|
||||
return -1;
|
||||
}
|
||||
virBufferAddLit(&buf, ",iommu=on");
|
||||
break;
|
||||
case VIR_DOMAIN_IOMMU_MODEL_LAST:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virCommandAddArgBuffer(cmd, &buf);
|
||||
}
|
||||
|
||||
|
|
|
@ -182,9 +182,9 @@
|
|||
<flag name='spice-unix'/>
|
||||
<flag name='drive-detect-zeroes'/>
|
||||
<flag name='display'/>
|
||||
<flag name='intel-iommu'/>
|
||||
<flag name='smm'/>
|
||||
<flag name='virtio-pci-disable-legacy'/>
|
||||
<flag name='machine-iommu'/>
|
||||
<version>2004000</version>
|
||||
<kvmVersion>0</kvmVersion>
|
||||
<package></package>
|
||||
|
|
|
@ -187,9 +187,9 @@
|
|||
<flag name='drive-detect-zeroes'/>
|
||||
<flag name='tls-creds-x509'/>
|
||||
<flag name='display'/>
|
||||
<flag name='intel-iommu'/>
|
||||
<flag name='smm'/>
|
||||
<flag name='virtio-pci-disable-legacy'/>
|
||||
<flag name='machine-iommu'/>
|
||||
<version>2005000</version>
|
||||
<kvmVersion>0</kvmVersion>
|
||||
<package></package>
|
||||
|
|
|
@ -193,9 +193,9 @@
|
|||
<flag name='drive-detect-zeroes'/>
|
||||
<flag name='tls-creds-x509'/>
|
||||
<flag name='display'/>
|
||||
<flag name='intel-iommu'/>
|
||||
<flag name='smm'/>
|
||||
<flag name='virtio-pci-disable-legacy'/>
|
||||
<flag name='machine-iommu'/>
|
||||
<version>2006000</version>
|
||||
<kvmVersion>0</kvmVersion>
|
||||
<package></package>
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
LC_ALL=C \
|
||||
PATH=/bin \
|
||||
HOME=/home/test \
|
||||
USER=test \
|
||||
LOGNAME=test \
|
||||
QEMU_AUDIO_DRV=none \
|
||||
/usr/bin/qemu \
|
||||
-name QEMUGuest1 \
|
||||
-S \
|
||||
-machine q35,accel=tcg,iommu=on \
|
||||
-m 214 \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||
-nographic \
|
||||
-nodefaults \
|
||||
-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
|
||||
-no-acpi \
|
||||
-boot c \
|
||||
-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1e \
|
||||
-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x0 \
|
||||
-device virtio-balloon-pci,id=balloon0,bus=pci.2,addr=0x1
|
|
@ -0,0 +1,37 @@
|
|||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
<memory unit='KiB'>219100</memory>
|
||||
<currentMemory unit='KiB'>219100</currentMemory>
|
||||
<vcpu placement='static'>1</vcpu>
|
||||
<os>
|
||||
<type arch='x86_64' machine='q35'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<controller type='pci' index='0' model='pcie-root'/>
|
||||
<controller type='pci' index='1' model='dmi-to-pci-bridge'>
|
||||
<model name='i82801b11-bridge'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
|
||||
</controller>
|
||||
<controller type='pci' index='2' model='pci-bridge'>
|
||||
<model name='pci-bridge'/>
|
||||
<target chassisNr='2'/>
|
||||
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||
</controller>
|
||||
<controller type='sata' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
||||
</controller>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<memballoon model='virtio'>
|
||||
<address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
|
||||
</memballoon>
|
||||
<iommu model='intel'/>
|
||||
</devices>
|
||||
</domain>
|
|
@ -2157,6 +2157,8 @@ mymain(void)
|
|||
DO_TEST("acpi-table", NONE);
|
||||
DO_TEST("intel-iommu", QEMU_CAPS_DEVICE_PCI_BRIDGE,
|
||||
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_INTEL_IOMMU);
|
||||
DO_TEST("intel-iommu-machine", QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_MACHINE_OPT,
|
||||
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_MACHINE_IOMMU);
|
||||
|
||||
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);
|
||||
|
||||
|
|
Loading…
Reference in New Issue