docs, conf, schemas: Add support for NVMe controller

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>
This commit is contained in:
Martin Kletzander
2025-06-09 15:12:38 +02:00
parent 6ef5644bfd
commit be1a89c950
14 changed files with 79 additions and 0 deletions
+10
View 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
+1
View 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",
+16
View 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;
+6
View 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;
+10
View File
@@ -3044,6 +3044,16 @@
</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">
+2
View 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,
+1
View 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:
+2
View 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;
}
+5
View 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:
+1
View 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;
}
+1
View 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:
+1
View 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"),
@@ -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>
+2
View 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, \