From: Martin Kletzander <mklet...@redhat.com>

Without any hotplug.

Signed-off-by: Martin Kletzander <mklet...@redhat.com>
Signed-off-by: Honglei Wang <honglei.w...@smartx.com>
---
 src/qemu/qemu_command.c        | 12 ++++++++++
 src/qemu/qemu_domain_address.c |  2 ++
 src/qemu/qemu_hotplug.c        |  3 ++-
 src/qemu/qemu_validate.c       | 44 +++++++++++++++++++++++++++-------
 4 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 528a8fc8ca86..9ec9ce343b50 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2854,6 +2854,17 @@ qemuBuildControllerDevProps(const virDomainDef 
*domainDef,
         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:
@@ -3016,6 +3027,7 @@ qemuBuildControllersCommandLine(virCommand *cmd,
         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++) {
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 9b2faf1e8e37..bb86cfa0c3f3 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -617,6 +617,8 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef 
*dev,
             break;
 
         case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+            return pciFlags;
+
         case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 9427eec64384..e1ed8181e303 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5941,7 +5941,8 @@ qemuDomainDetachPrepController(virDomainObj *vm,
     int idx;
     virDomainControllerDef *controller = NULL;
 
-    if (match->type != VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
+    if (match->type != VIR_DOMAIN_CONTROLLER_TYPE_SCSI &&
+        match->type != VIR_DOMAIN_CONTROLLER_TYPE_NVME) {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                        _("'%1$s' controller cannot be hot unplugged."),
                        virDomainControllerTypeToString(match->type));
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index a264185f5f43..8730cf4e941f 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3633,6 +3633,26 @@ qemuValidateDomainDeviceDefControllerSATA(const 
virDomainControllerDef *controll
 }
 
 
+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)
@@ -3804,10 +3824,17 @@ qemuValidateDomainDeviceDefControllerAttributes(const 
virDomainControllerDef *co
           (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",
@@ -3819,11 +3846,6 @@ qemuValidateDomainDeviceDefControllerAttributes(const 
virDomainControllerDef *co
                            _("'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"));
@@ -4408,6 +4430,10 @@ qemuValidateDomainDeviceDefController(const 
virDomainControllerDef *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:
-- 
2.49.0

Reply via email to