mirror of
https://github.com/libvirt/libvirt.git
synced 2026-08-09 12:38:27 -05:00
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:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
@@ -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, \
|
||||
|
||||
Reference in New Issue
Block a user