From: Martin Kletzander <mkletzan(a)redhat.com>
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
Signed-off-by: Honglei Wang <honglei.wang(a)smartx.com>
---
docs/formatdomain.rst | 10 +++++++++
src/bhyve/bhyve_command.c | 1 +
src/conf/domain_conf.c | 16 ++++++++++++++
src/conf/domain_conf.h | 6 ++++++
src/conf/schemas/domaincommon.rng | 10 +++++++++
src/conf/virconftypes.h | 2 ++
src/qemu/qemu_command.c | 1 +
src/qemu/qemu_domain_address.c | 2 ++
src/qemu/qemu_hotplug.c | 5 +++++
src/qemu/qemu_postparse.c | 1 +
src/qemu/qemu_validate.c | 1 +
src/vbox/vbox_common.c | 1 +
.../genericxml2xmlindata/controller-nvme.xml | 21 +++++++++++++++++++
tests/genericxml2xmltest.c | 2 ++
14 files changed, 79 insertions(+)
create mode 100644 tests/genericxml2xmlindata/controller-nvme.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 8753ee9c23a8..fdc90c61f86d 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -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
diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index cd1ccf61f3a0..916d699c8030 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -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",
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b3b0bd732955..1b09e25b53b6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -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:
@@ -24039,6 +24050,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;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 58b97a2b5490..f184a4b9b774 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -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;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 5597d5a66baf..029d4ed4ec7a 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -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">
diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h
index c70437bc05fd..8c6fcdbeaabd 100644
--- a/src/conf/virconftypes.h
+++ b/src/conf/virconftypes.h
@@ -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,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index fec48edfc1da..07963e33b351 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -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:
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index e89cdee487bc..7bc769fc1934 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -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;
}
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index e84ad816a0f1..7a1170b2ddd1 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -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:
diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c
index ed4af9ca8e8c..8150dffac67c 100644
--- a/src/qemu/qemu_postparse.c
+++ b/src/qemu/qemu_postparse.c
@@ -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;
}
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index e45f63641864..23a4d70b3441 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -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:
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 349ac832dc0a..6ffe7cc20bde 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -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
index 000000000000..b2e8556c9d45
--- /dev/null
+++ b/tests/genericxml2xmlindata/controller-nvme.xml
@@ -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>
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index dd26a8589dda..f4e04d84f825 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -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, \
--
2.49.0