break;
case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+ if (virJSONValueObjectAdd(&props,
+ "s:driver", "nvme",
+ "s:id", def->info.alias,
+ "s:serial", def->opts.nvmeopts.serial,
+ "p:num_queues", def->queues,
+ "T:ioeventfd", def->ioeventfd,
+ NULL) < 0)
+ return -1;
+
+ break;
+
case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
VIR_DOMAIN_CONTROLLER_TYPE_IDE,
VIR_DOMAIN_CONTROLLER_TYPE_SATA,
VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
+ VIR_DOMAIN_CONTROLLER_TYPE_NVME,
};
for (i = 0; i < G_N_ELEMENTS(contOrder); i++) {
}
+static int
+qemuValidateDomainDeviceDefControllerNVME(const virDomainControllerDef *controller,
+ const virDomainDef *def G_GNUC_UNUSED,
+ virQEMUCaps *qemuCaps)
+{
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVME)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("NVMe controllers are not supported with this QEMU binary"));
+ }
+
+ if (!controller->opts.nvmeopts.serial) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Missing mandatory serial for NVMe controller"));
+ return -1;
+ }
+
+ return 0;
+}
+
+
static int
qemuValidateDomainDeviceDefControllerIDE(const virDomainControllerDef *controller,
const virDomainDef *def)
(controller->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI ||
controller->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_TRANSITIONAL ||
controller->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_NON_TRANSITIONAL))) {
- if (controller->queues) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("'queues' is only supported by virtio-scsi controller"));
- return -1;
+ if (controller->type != VIR_DOMAIN_CONTROLLER_TYPE_NVME) {
+ if (controller->queues) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("'queues' is only supported by virtio-scsi and nvme controllers"));
+ return -1;
+ }
+ if (controller->ioeventfd) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("'ioeventfd' is only supported by virtio-scsi and nvme controllers"));
+ return -1;
+ }
}
if (controller->cmd_per_lun) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("'max_sectors' is only supported by virtio-scsi controller"));
return -1;
}
- if (controller->ioeventfd) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("'ioeventfd' is only supported by virtio-scsi controller"));
- return -1;
- }
if (controller->iothread) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("'iothread' is only supported for virtio-scsi controller"));
break;
case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+ ret = qemuValidateDomainDeviceDefControllerNVME(controller, def,
+ qemuCaps);
+ break;
+
case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
case VIR_DOMAIN_CONTROLLER_TYPE_CCID: