static int
qemuBuildVirtioOptionsStr(virBufferPtr buf,
- virDomainVirtioOptionsPtr virtio,
- virQEMUCapsPtr qemuCaps)
+ virDomainVirtioOptionsPtr virtio)
{
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));
}
if (virtio->packed != VIR_TRISTATE_SWITCH_ABSENT) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PACKED_QUEUES)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("the packed setting is not supported with this "
- "QEMU binary"));
- return -1;
- }
virBufferAsprintf(buf, ",packed=%s",
virTristateSwitchTypeToString(virtio->packed));
}
virBufferAsprintf(&opt, ",num-queues=%u", disk->queues);
}
- if (qemuBuildVirtioOptionsStr(&opt, disk->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&opt, disk->virtio) < 0)
return NULL;
if (qemuBuildDeviceAddressStr(&opt, def, &disk->info, qemuCaps) < 0)
virBufferAsprintf(&opt, ",queue-size=%llu", fs->queue_size);
virBufferAddLit(&opt, ",tag=");
virQEMUBuildBufferEscapeComma(&opt, fs->dst);
- if (qemuBuildVirtioOptionsStr(&opt, fs->virtio, priv->qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&opt, fs->virtio) < 0)
return -1;
if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, priv->qemuCaps) < 0)
virBufferAddLit(&opt, ",mount_tag=");
virQEMUBuildBufferEscapeComma(&opt, fs->dst);
- if (qemuBuildVirtioOptionsStr(&opt, fs->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&opt, fs->virtio) < 0)
return NULL;
if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, qemuCaps) < 0)
def->iothread);
}
- if (qemuBuildVirtioOptionsStr(&buf, def->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, def->virtio) < 0)
return -1;
break;
case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC:
virBufferAsprintf(&buf, ",vectors=%d",
def->opts.vioserial.vectors);
}
- if (qemuBuildVirtioOptionsStr(&buf, def->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, def->virtio) < 0)
return -1;
break;
if (bootindex)
virBufferAsprintf(&buf, ",bootindex=%u", bootindex);
if (usingVirtio &&
- qemuBuildVirtioOptionsStr(&buf, net->virtio, qemuCaps) < 0)
+ qemuBuildVirtioOptionsStr(&buf, net->virtio) < 0)
return NULL;
return virBufferContentAndReset(&buf);
virTristateSwitchTypeToString(def->memballoon->autodeflate));
}
- if (qemuBuildVirtioOptionsStr(&buf, def->memballoon->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, def->memballoon->virtio) < 0)
return -1;
if (qemuCommandAddExtDevice(cmd, &def->memballoon->info) < 0)
if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0)
return NULL;
- if (qemuBuildVirtioOptionsStr(&buf, dev->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, dev->virtio) < 0)
return NULL;
return virBufferContentAndReset(&buf);
if (qemuBuildDeviceAddressStr(&buf, def, &video->info, qemuCaps) < 0)
return NULL;
- if (qemuBuildVirtioOptionsStr(&buf, video->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, video->virtio) < 0)
return NULL;
return virBufferContentAndReset(&buf);
virBufferAddLit(&buf, ",period=1000");
}
- if (qemuBuildVirtioOptionsStr(&buf, dev->virtio, qemuCaps) < 0)
+ if (qemuBuildVirtioOptionsStr(&buf, dev->virtio) < 0)
return NULL;
if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0)
}
+static int
+qemuValidateDomainVirtioOptions(const virDomainVirtioOptions *virtio,
+ virQEMUCapsPtr qemuCaps)
+{
+ if (!virtio)
+ return 0;
+
+ if (virtio->iommu != VIR_TRISTATE_SWITCH_ABSENT &&
+ !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;
+ }
+
+ if (virtio->ats != VIR_TRISTATE_SWITCH_ABSENT &&
+ !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;
+ }
+
+ if (virtio->packed != VIR_TRISTATE_SWITCH_ABSENT &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PACKED_QUEUES)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("the packed setting is not supported with this "
+ "QEMU binary"));
+ return -1;
+ }
+ return 0;
+}
+
+
static int
qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net,
virQEMUCapsPtr qemuCaps)
_("tx_queue_size has to be a power of two"));
return -1;
}
+ if (qemuValidateDomainVirtioOptions(net->virtio, qemuCaps) < 0)
+ return -1;
}
if (net->mtu &&
static int
qemuValidateDomainRNGDef(const virDomainRNGDef *def,
- virQEMUCapsPtr qemuCaps G_GNUC_UNUSED)
+ virQEMUCapsPtr qemuCaps)
{
if (def->backend == VIR_DOMAIN_RNG_BACKEND_EGD &&
qemuValidateDomainChrSourceDef(def->source.chardev, qemuCaps) < 0)
return -1;
+ if (qemuValidateDomainVirtioOptions(def->virtio, qemuCaps) < 0)
+ return -1;
+
return 0;
}
}
}
+ if (qemuValidateDomainVirtioOptions(video->virtio, qemuCaps) < 0)
+ return -1;
+
return 0;
}
return -1;
}
+ if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO &&
+ qemuValidateDomainVirtioOptions(disk->virtio, qemuCaps) < 0) {
+ return -1;
+ }
+
return 0;
}
static int
-qemuValidateDomainDeviceDefControllerAttributes(const virDomainControllerDef *controller)
+qemuValidateDomainDeviceDefControllerAttributes(const virDomainControllerDef *controller,
+ virQEMUCapsPtr qemuCaps)
{
if (!(controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI &&
(controller->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI ||
_("'iothread' is only supported for virtio-scsi controller"));
return -1;
}
+ if (qemuValidateDomainVirtioOptions(controller->virtio, qemuCaps) < 0)
+ return -1;
+ }
+
+ if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL &&
+ qemuValidateDomainVirtioOptions(controller->virtio, qemuCaps) < 0) {
+ return -1;
}
return 0;
!qemuValidateCheckSCSIControllerModel(qemuCaps, controller->model))
return -1;
- if (qemuValidateDomainDeviceDefControllerAttributes(controller) < 0)
+ if (qemuValidateDomainDeviceDefControllerAttributes(controller, qemuCaps) < 0)
return -1;
switch ((virDomainControllerType)controller->type) {
return -1;
}
+ if (qemuValidateDomainVirtioOptions(fs->virtio, qemuCaps) < 0)
+ return -1;
+
return 0;
}
return -1;
}
+ if (qemuValidateDomainVirtioOptions(input->virtio, qemuCaps) < 0)
+ return -1;
+
return 0;
}
return -1;
}
+ if (qemuValidateDomainVirtioOptions(memballoon->virtio, qemuCaps) < 0)
+ return -1;
+
return 0;
}
DO_TEST_CAPS_LATEST("virtio-options-net-packed");
DO_TEST_CAPS_LATEST("virtio-options-rng-packed");
DO_TEST_CAPS_LATEST("virtio-options-video-packed");
- DO_TEST_FAILURE("virtio-options-controller-iommu", QEMU_CAPS_VIRTIO_SCSI);
- DO_TEST_FAILURE("virtio-options-disk-iommu", NONE);
- DO_TEST_FAILURE("virtio-options-fs-iommu", NONE);
- DO_TEST_FAILURE("virtio-options-input-iommu", QEMU_CAPS_VIRTIO_MOUSE,
- QEMU_CAPS_VIRTIO_KEYBOARD);
- DO_TEST_FAILURE("virtio-options-memballoon-iommu", NONE);
- DO_TEST_FAILURE("virtio-options-net-iommu", NONE);
- DO_TEST_FAILURE("virtio-options-rng-iommu", QEMU_CAPS_DEVICE_VIRTIO_RNG,
- QEMU_CAPS_OBJECT_RNG_RANDOM);
- DO_TEST_FAILURE("virtio-options-video-iommu", QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_VIRTIO_GPU_VIRGL,
- QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
- QEMU_CAPS_DEVICE_VHOST_USER_GPU);
- DO_TEST_FAILURE("virtio-options-controller-ats", QEMU_CAPS_VIRTIO_SCSI);
- DO_TEST_FAILURE("virtio-options-disk-ats", NONE);
- DO_TEST_FAILURE("virtio-options-fs-ats", NONE);
- DO_TEST_FAILURE("virtio-options-input-ats", QEMU_CAPS_VIRTIO_MOUSE,
- QEMU_CAPS_VIRTIO_KEYBOARD);
- DO_TEST_FAILURE("virtio-options-memballoon-ats", NONE);
- DO_TEST_FAILURE("virtio-options-net-ats", NONE);
- DO_TEST_FAILURE("virtio-options-rng-ats", QEMU_CAPS_DEVICE_VIRTIO_RNG,
- QEMU_CAPS_OBJECT_RNG_RANDOM);
- DO_TEST_FAILURE("virtio-options-video-ats", QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_VIRTIO_GPU_VIRGL,
- QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
- QEMU_CAPS_DEVICE_VHOST_USER_GPU);
- DO_TEST_FAILURE("virtio-options-controller-packed", QEMU_CAPS_VIRTIO_SCSI);
- DO_TEST_FAILURE("virtio-options-disk-packed", NONE);
- DO_TEST_FAILURE("virtio-options-fs-packed", NONE);
- DO_TEST_FAILURE("virtio-options-input-packed", QEMU_CAPS_VIRTIO_MOUSE,
- QEMU_CAPS_VIRTIO_KEYBOARD);
- DO_TEST_FAILURE("virtio-options-memballoon-packed", NONE);
- DO_TEST_FAILURE("virtio-options-net-packed", NONE);
- DO_TEST_FAILURE("virtio-options-rng-packed", QEMU_CAPS_DEVICE_VIRTIO_RNG,
- QEMU_CAPS_OBJECT_RNG_RANDOM);
- DO_TEST_FAILURE("virtio-options-video-packed", QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_DEVICE_VIRTIO_GPU,
- QEMU_CAPS_VIRTIO_GPU_VIRGL,
- QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
- QEMU_CAPS_DEVICE_VHOST_USER_GPU);
+ DO_TEST_PARSE_ERROR("virtio-options-controller-iommu", QEMU_CAPS_VIRTIO_SCSI);
+ DO_TEST_PARSE_ERROR("virtio-options-disk-iommu", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-fs-iommu", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-input-iommu", QEMU_CAPS_VIRTIO_MOUSE,
+ QEMU_CAPS_VIRTIO_KEYBOARD);
+ DO_TEST_PARSE_ERROR("virtio-options-net-iommu", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-memballoon-iommu", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-rng-iommu", QEMU_CAPS_DEVICE_VIRTIO_RNG,
+ QEMU_CAPS_OBJECT_RNG_RANDOM);
+ DO_TEST_PARSE_ERROR("virtio-options-video-iommu", QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_VIRTIO_GPU_VIRGL,
+ QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
+ QEMU_CAPS_DEVICE_VHOST_USER_GPU);
+ DO_TEST_PARSE_ERROR("virtio-options-controller-ats", QEMU_CAPS_VIRTIO_SCSI);
+ DO_TEST_PARSE_ERROR("virtio-options-disk-ats", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-fs-ats", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-input-ats", QEMU_CAPS_VIRTIO_MOUSE,
+ QEMU_CAPS_VIRTIO_KEYBOARD);
+ DO_TEST_PARSE_ERROR("virtio-options-memballoon-ats", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-net-ats", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-rng-ats", QEMU_CAPS_DEVICE_VIRTIO_RNG,
+ QEMU_CAPS_OBJECT_RNG_RANDOM);
+ DO_TEST_PARSE_ERROR("virtio-options-video-ats", QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_VIRTIO_GPU_VIRGL,
+ QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
+ QEMU_CAPS_DEVICE_VHOST_USER_GPU);
+ DO_TEST_PARSE_ERROR("virtio-options-controller-packed", QEMU_CAPS_VIRTIO_SCSI);
+ DO_TEST_PARSE_ERROR("virtio-options-disk-packed", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-fs-packed", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-input-packed", QEMU_CAPS_VIRTIO_MOUSE,
+ QEMU_CAPS_VIRTIO_KEYBOARD);
+ DO_TEST_PARSE_ERROR("virtio-options-memballoon-packed", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-net-packed", NONE);
+ DO_TEST_PARSE_ERROR("virtio-options-rng-packed", QEMU_CAPS_DEVICE_VIRTIO_RNG,
+ QEMU_CAPS_OBJECT_RNG_RANDOM);
+ DO_TEST_PARSE_ERROR("virtio-options-video-packed", QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_VIRTIO_GPU_VIRGL,
+ QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
+ QEMU_CAPS_DEVICE_VHOST_USER_GPU);
DO_TEST("fd-memory-numa-topology", QEMU_CAPS_OBJECT_MEMORY_FILE,
QEMU_CAPS_KVM);