]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
docs, conf, schemas: Add support for NVMe controller
authorMartin Kletzander <mkletzan@redhat.com>
Tue, 20 May 2025 09:07:45 +0000 (11:07 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Mon, 9 Jun 2025 13:12:38 +0000 (15:12 +0200)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Signed-off-by: Honglei Wang <honglei.wang@smartx.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
14 files changed:
docs/formatdomain.rst
src/bhyve/bhyve_command.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/schemas/domaincommon.rng
src/conf/virconftypes.h
src/qemu/qemu_command.c
src/qemu/qemu_domain_address.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_postparse.c
src/qemu/qemu_validate.c
src/vbox/vbox_common.c
tests/genericxml2xmlindata/controller-nvme.xml [new file with mode: 0644]
tests/genericxml2xmltest.c

index 1acf203d18fa1f5da1adb802ff6ebb64c5bc5b3e..4c70ff004c9b70ce3f164f8505e1a35423be627e 100644 (file)
@@ -4140,6 +4140,10 @@ device hotplug is expected.
        <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
      </controller>
      <controller type='xenbus' maxGrantFrames='64' maxEventChannels='2047'/>
+     <controller type='nvme'>
+       <serial>
+       ...
+       </serial>
      ...
    </devices>
    ...
@@ -4186,6 +4190,12 @@ specific features, such as:
    specifies maximum number of event channels (PV interrupts) that can be used
    by the guest.
 
+``nvme``
+   Supported :since:`Since 11.5.0`, the ``nvme`` controller can be used to
+   support NVMe disks.  It has an optional ``serial`` sub-element just like
+   regular disks do.
+
+
 Note: The PowerPC64 "spapr-vio" addresses do not have an associated controller.
 
 For controllers that are themselves devices on a PCI or USB bus, an optional
index cd1ccf61f3a05c9406ab31061354ea5131d40a57..916d699c8030d10d50ce29d4b8f6d04822e31d15 100644 (file)
@@ -425,6 +425,7 @@ bhyveBuildControllerArgStr(const virDomainDef *def,
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
index be70ec3b9638cf9c9123d0cf7560f279a92e1343..447f1ff4473cc7c5bc9a657b08d0fad8a25e92e2 100644 (file)
@@ -420,6 +420,7 @@ VIR_ENUM_IMPL(virDomainController,
               "pci",
               "xenbus",
               "isa",
+              "nvme",
 );
 
 VIR_ENUM_IMPL(virDomainControllerModelPCI,
@@ -2563,6 +2564,7 @@ virDomainControllerDefNew(virDomainControllerType type)
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
@@ -2581,6 +2583,9 @@ void virDomainControllerDefFree(virDomainControllerDef *def)
     virDomainDeviceInfoClear(&def->info);
     g_free(def->virtio);
 
+    if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_NVME)
+        g_free(def->opts.nvmeopts.serial);
+
     g_free(def);
 }
 
@@ -8784,6 +8789,7 @@ virDomainControllerModelTypeFromString(const virDomainControllerDef *def,
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         return -1;
     }
@@ -8812,6 +8818,7 @@ virDomainControllerModelTypeToString(virDomainControllerDef *def,
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         return NULL;
     }
@@ -9048,6 +9055,10 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt,
         break;
     }
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+        def->opts.nvmeopts.serial = virXPathString("string(./serial)", ctxt);
+        break;
+
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
@@ -24028,6 +24039,11 @@ virDomainControllerDefFormat(virBuffer *buf,
         }
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+        virBufferEscapeString(&childBuf, "<serial>%s</serial>\n",
+                              def->opts.nvmeopts.serial);
+        break;
+
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
         if (virDomainControllerDefFormatPCI(&childBuf, def, flags) < 0)
             return -1;
index 5e02c15ed5b9b5fbd0fa233484518fd6644cad8b..13d4147c44fddef1c6d239e04ed4cd321839cf1c 100644 (file)
@@ -611,6 +611,7 @@ typedef enum {
     VIR_DOMAIN_CONTROLLER_TYPE_PCI,
     VIR_DOMAIN_CONTROLLER_TYPE_XENBUS,
     VIR_DOMAIN_CONTROLLER_TYPE_ISA,
+    VIR_DOMAIN_CONTROLLER_TYPE_NVME,
 
     VIR_DOMAIN_CONTROLLER_TYPE_LAST
 } virDomainControllerType;
@@ -766,6 +767,10 @@ struct _virDomainXenbusControllerOpts {
     int maxEventChannels; /* -1 == undef */
 };
 
+struct _virDomainNVMeControllerOpts {
+    char *serial;
+};
+
 /* Stores the virtual disk controller configuration */
 struct _virDomainControllerDef {
     virDomainControllerType type;
@@ -782,6 +787,7 @@ struct _virDomainControllerDef {
         virDomainPCIControllerOpts pciopts;
         virDomainUSBControllerOpts usbopts;
         virDomainXenbusControllerOpts xenbusopts;
+        virDomainNVMeControllerOpts nvmeopts;
     } opts;
     virDomainDeviceInfo info;
     virDomainVirtioOptions *virtio;
index 81afa10083da1e8d533253ef37d32bd973768ae5..3317cf1665f6eb2e18eda141d27be73bbc497651 100644 (file)
               </attribute>
             </optional>
           </group>
+          <group>
+            <attribute name="type">
+              <value>nvme</value>
+            </attribute>
+            <optional>
+              <element name="serial">
+                <ref name="diskSerial"/>
+              </element>
+            </optional>
+          </group>
         </choice>
         <optional>
           <element name="driver">
index c70437bc05fdf0f418f4d8ae301c68848c218965..8c6fcdbeaabdba97bcaf51ff656505ade29b898f 100644 (file)
@@ -276,6 +276,8 @@ typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallback
 
 typedef struct _virDomainXenbusControllerOpts virDomainXenbusControllerOpts;
 
+typedef struct _virDomainNVMeControllerOpts virDomainNVMeControllerOpts;
+
 typedef enum {
     VIR_DOMAIN_DISK_IO_DEFAULT = 0,
     VIR_DOMAIN_DISK_IO_NATIVE,
index 77e7ea12994788b494ee773715ab95c7d0bb7534..d7fb88cbc13359a3a31a445718285671f8aa87cf 100644 (file)
@@ -2851,6 +2851,7 @@ qemuBuildControllerDevProps(const virDomainDef *domainDef,
 
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
index e89cdee487bc801d5fc9cc158529e1793979340e..7bc769fc1934c77a01fea3aa94fd9f477de17e3a 100644 (file)
@@ -616,6 +616,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
             }
             break;
 
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
         case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
@@ -1919,6 +1920,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDef *def,
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
         case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
         case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
             break;
         }
index e84ad816a0f1fb2248cd154615fe3650109f4bf5..7a1170b2ddd14234879d1863efd7f306db0b22f3 100644 (file)
@@ -5856,6 +5856,10 @@ qemuDomainDiskControllerIsBusy(virDomainObj *vm,
                 continue;
             break;
 
+        case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
+            /* nvme is not supported by the qemu driver */
+            break;
+
         case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
             /* xenbus is not supported by the qemu driver */
             continue;
@@ -5905,6 +5909,7 @@ qemuDomainControllerIsBusy(virDomainObj *vm,
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
     case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
         return qemuDomainDiskControllerIsBusy(vm, detach);
 
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
index ed4af9ca8e8c199289f851334a178b650e67ab1d..8150dffac67c1929f6f9f9182f304de926337df4 100644 (file)
@@ -429,6 +429,7 @@ qemuDomainControllerDefPostParse(virDomainControllerDef *cont,
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
index 2cc52ff3bc409c81f548b380b69596f61e19b2b1..56747a38bea06edb0fd7839f2b6b236c38bb7618 100644 (file)
@@ -4402,6 +4402,7 @@ qemuValidateDomainDeviceDefController(const virDomainControllerDef *controller,
                                                         qemuCaps);
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
index 929d452abdb4d0a378c39b50ce3e7ea83d60d9b0..7e4e2dde86bfcc99cb3c783a9f886ae25a659473 100644 (file)
@@ -494,6 +494,7 @@ vboxSetStorageController(virDomainControllerDef *controller,
     case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_ISA:
+    case VIR_DOMAIN_CONTROLLER_TYPE_NVME:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         vboxReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                         _("The vbox driver does not support %1$s controller type"),
diff --git a/tests/genericxml2xmlindata/controller-nvme.xml b/tests/genericxml2xmlindata/controller-nvme.xml
new file mode 100644 (file)
index 0000000..b2e8556
--- /dev/null
@@ -0,0 +1,21 @@
+<domain type='qemu'>
+  <name>bar</name>
+  <uuid>00010203-0405-4607-8809-0a0b0c0d0e0f</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>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>
+    <controller type='nvme' index='0'/>
+    <controller type='nvme' index='1'>
+      <serial>CDEFGAHC</serial>
+    </controller>
+  </devices>
+</domain>
index dd26a8589ddaf2b77f1e137dc3b5e884fea9af14..f4e04d84f8250f93a030e087a8dce3bca1f0df74 100644 (file)
@@ -231,6 +231,8 @@ mymain(void)
 
     DO_TEST("fibrechannel-appid");
 
+    DO_TEST("controller-nvme");
+
 #define DO_TEST_BACKUP_FULL(name, intrnl) \
     do { \
         const struct testCompareBackupXMLData data = { .testname = name, \