mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
qemu: format virtio-related options on the command line
Format iommu_platform= and ats= for virtio devices. https://bugzilla.redhat.com/show_bug.cgi?id=1283251 Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
56a28fbb57
commit
b2cbc3a060
@ -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 },
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -216,6 +216,8 @@
|
||||
<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>
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user