[PATCH 0/5] qemu: Introduce nvme disk emulation support

From: hongleiwang <honglei.wang@smartx.com> QEMU has supported nvme disk emulation for a long time, see: https://qemu-project.gitlab.io/qemu/system/devices/nvme.html. The following patches introduce nvme and nvme-ns disk bus type: A disk with nvme as bus is represented as nvme disk that contains only one nvme namespace. In XML, it can be used like this: <devices> ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> <target dev='nvmea' bus='nvme'/> <serial>nvme-serial-value</serial> </disk> ... </devices> A disk with nvme-ns as bus is represented as an nvme namespace and needs to be attached to an nvme controller. In XML, it can be used like this: <devices> ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> <target dev='nvmensa' bus='nvme-ns'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='nvme' index='0'> <serial>nvme-controller-serial-value</serial> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </controller> ... </devices> ray (5): qemu: Add support for NVMe disk bus type qemu: Add support for NVMe namespace disk bus type qemu_capabilities: Add support for NVMe disk capabilities docs: Add NVMe and NVMe namespace disk bus types to documentation tests: Add test case for NVMe device configuration docs/formatdomain.rst | 5 ++- src/conf/domain_conf.c | 42 +++++++++++++++++++ src/conf/domain_conf.h | 8 ++++ src/conf/domain_postparse.c | 4 ++ src/conf/domain_validate.c | 5 ++- src/conf/schemas/domaincommon.rng | 12 +++++- src/conf/virconftypes.h | 2 + src/hyperv/hyperv_driver.c | 4 ++ src/qemu/qemu_alias.c | 2 + src/qemu/qemu_capabilities.c | 10 +++++ src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 31 ++++++++++++++ src/qemu/qemu_domain_address.c | 30 +++++++++++-- src/qemu/qemu_domain_address.h | 4 ++ src/qemu/qemu_hotplug.c | 14 +++++++ src/qemu/qemu_postparse.c | 1 + src/qemu/qemu_validate.c | 40 ++++++++++++++++++ src/test/test_driver.c | 4 ++ src/util/virutil.c | 2 +- src/vbox/vbox_common.c | 3 ++ src/vmx/vmx.c | 2 + tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_10.0.0.s390x.xml | 2 + tests/domaincapsdata/qemu_10.0.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml | 2 + .../domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml | 2 + tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_5.2.0.aarch64.xml | 2 + tests/domaincapsdata/qemu_5.2.0.ppc64.xml | 2 + tests/domaincapsdata/qemu_5.2.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml | 2 + tests/domaincapsdata/qemu_6.0.0.aarch64.xml | 2 + tests/domaincapsdata/qemu_6.0.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.1.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml | 2 + tests/domaincapsdata/qemu_6.2.0.aarch64.xml | 2 + tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 2 + tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 2 + .../domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml | 2 + tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml | 2 + tests/domaincapsdata/qemu_7.0.0.aarch64.xml | 2 + tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 2 + tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 2 + tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml | 2 + tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml | 2 + tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_7.2.0.ppc.xml | 2 + tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 2 + .../domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 2 + .../qemu_8.2.0-tcg-virt.loongarch64.xml | 2 + tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml | 2 + .../domaincapsdata/qemu_8.2.0-virt.loongarch64.xml | 2 + tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 2 + tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 2 + tests/domaincapsdata/qemu_8.2.0.s390x.xml | 2 + tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 2 + .../domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml | 2 + tests/domaincapsdata/qemu_9.1.0.s390x.xml | 2 + tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml | 2 + tests/domaincapsdata/qemu_9.2.0.s390x.xml | 2 + tests/domaincapsdata/qemu_9.2.0.x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 2 + tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml | 2 + tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 2 + tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml | 2 + tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml | 2 + tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml | 2 + tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 2 + tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 2 + .../caps_7.0.0_aarch64+hvf.xml | 2 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml | 2 + tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 2 + tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 2 + tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 2 + .../qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 2 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 2 + tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 2 + tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 2 + .../caps_8.2.0_loongarch64.xml | 2 + tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 2 + tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml | 2 + tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 2 + tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 2 + tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 2 + tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 2 + .../disk-nvme-device.x86_64-latest.args | 38 +++++++++++++++++ .../disk-nvme-device.x86_64-latest.xml | 49 ++++++++++++++++++++++ tests/qemuxmlconfdata/disk-nvme-device.xml | 46 ++++++++++++++++++++ tests/qemuxmlconftest.c | 1 + 133 files changed, 569 insertions(+), 8 deletions(-) create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.xml -- 2.11.0

From: ray <honglei.wang@smartx.com> This patch adds support for the NVMe disk bus type across multiple components: - Extend virDomainDiskBus enum to include VIR_DOMAIN_DISK_BUS_NVME - Update driver-specific functions to handle NVMe disks - Modify disk name parsing to recognize 'nvme' prefix - Ensure NVMe disks require a serial number and PCI address Signed-off-by: ray <honglei.wang@smartx.com> --- src/conf/domain_conf.c | 3 +++ src/conf/domain_conf.h | 1 + src/conf/domain_postparse.c | 2 ++ src/conf/domain_validate.c | 4 +++- src/hyperv/hyperv_driver.c | 2 ++ src/qemu/qemu_alias.c | 1 + src/qemu/qemu_command.c | 5 +++++ src/qemu/qemu_domain_address.c | 25 ++++++++++++++++++++++--- src/qemu/qemu_domain_address.h | 4 ++++ src/qemu/qemu_hotplug.c | 6 ++++++ src/qemu/qemu_validate.c | 16 ++++++++++++++++ src/test/test_driver.c | 2 ++ src/util/virutil.c | 2 +- src/vbox/vbox_common.c | 1 + src/vmx/vmx.c | 1 + 15 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 49555efc56..bc101cca0e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -372,6 +372,7 @@ VIR_ENUM_IMPL(virDomainDiskBus, "uml", "sata", "sd", + "nvme", ); VIR_ENUM_IMPL(virDomainDiskCache, @@ -6778,6 +6779,7 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt G_GNUC_UNUSED, case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: /* Other disk bus's aren't controller based */ @@ -29201,6 +29203,7 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_UML: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: *busIdx = 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9da6586e66..5cde6783c2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -401,6 +401,7 @@ typedef enum { VIR_DOMAIN_DISK_BUS_UML, VIR_DOMAIN_DISK_BUS_SATA, VIR_DOMAIN_DISK_BUS_SD, + VIR_DOMAIN_DISK_BUS_NVME, VIR_DOMAIN_DISK_BUS_LAST } virDomainDiskBus; diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index bf33f29638..a07ec8d94e 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -523,6 +523,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk, disk->bus = VIR_DOMAIN_DISK_BUS_XEN; else if (STRPREFIX(disk->dst, "ubd")) disk->bus = VIR_DOMAIN_DISK_BUS_UML; + else if (STRPREFIX(disk->dst, "nvme")) + disk->bus = VIR_DOMAIN_DISK_BUS_NVME; } } diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 563558d920..4c96d7cacd 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -267,6 +267,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: return true; } @@ -930,7 +931,8 @@ virDomainDiskDefValidate(const virDomainDef *def, !STRPREFIX(disk->dst, "sd") && !STRPREFIX(disk->dst, "vd") && !STRPREFIX(disk->dst, "xvd") && - !STRPREFIX(disk->dst, "ubd")) { + !STRPREFIX(disk->dst, "ubd") && + !STRPREFIX(disk->dst, "nvme")) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid harddisk device name: %1$s"), disk->dst); return -1; diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 43ccb9cbd7..708e10b7dc 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -948,6 +948,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomainDef *def, const char *ho case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported controller type")); @@ -3090,6 +3091,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid disk bus in definition")); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 3e6bced4a8..9d39ebd63d 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -258,6 +258,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def, case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_NVME: diskPriv->qomName = g_strdup(disk->info.alias); break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 54130ac4f0..7b33fa1bec 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -544,6 +544,7 @@ qemuBuildDeviceAddresDriveProps(virJSONValue *props, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1733,6 +1734,10 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, driver = "floppy"; break; + case VIR_DOMAIN_DISK_BUS_NVME: + driver = "nvme"; + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 970ae3949d..df17afb5b9 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -730,6 +730,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, } return 0; + case VIR_DOMAIN_DISK_BUS_NVME: + return pciFlags; + case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_SCSI: @@ -2228,10 +2231,10 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, } } - /* Disks (VirtIO only for now) */ + /* Disks (VirtIO and NVMe only for now) */ for (i = 0; i < def->ndisks; i++) { - /* Only VirtIO disks use PCI addrs */ - if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO) + /* Only VirtIO adn NVMe disks use PCI addrs */ + if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO && def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_NVME) continue; /* don't touch s390 devices */ @@ -3327,3 +3330,19 @@ qemuDomainEnsureVirtioAddress(bool *releaseAddr, virDomainCCWAddressSetFree(ccwaddrs); return ret; } + +int +qemuDomainEnsureNvmeAddress(bool *releaseAddr, + virDomainObj *vm, + virDomainDeviceDef *dev) +{ + int ret = 0; + + if (qemuDomainEnsurePCIAddress(vm, dev) < 0) { + ret = -1; + } else { + *releaseAddr = true; + } + + return ret; +} diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h index 78fcd74234..fcf9af5944 100644 --- a/src/qemu/qemu_domain_address.h +++ b/src/qemu/qemu_domain_address.h @@ -51,3 +51,7 @@ void qemuDomainReleaseMemoryDeviceSlot(virDomainObj *vm, int qemuDomainEnsureVirtioAddress(bool *releaseAddr, virDomainObj *vm, virDomainDeviceDef *dev); + +int qemuDomainEnsureNvmeAddress(bool *releaseAddr, + virDomainObj *vm, + virDomainDeviceDef *dev); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 28ca321c5c..2673c6818a 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1039,6 +1039,11 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver, } break; + case VIR_DOMAIN_DISK_BUS_NVME: + if (qemuDomainEnsureNvmeAddress(&releaseVirtio, vm, dev) < 0) + goto cleanup; + break; + case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_XEN: @@ -5719,6 +5724,7 @@ qemuDomainDetachPrepDisk(virDomainObj *vm, case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_NVME: break; case VIR_DOMAIN_DISK_BUS_IDE: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 3e3e368da3..e7e00fa761 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2822,6 +2822,7 @@ qemuValidateDomainDeviceDefDiskIOThreads(const virDomainDef *def, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOThreads not available for bus %1$s target %2$s"), @@ -3036,6 +3037,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("disk device='lun' is not supported for bus='%1$s'"), virDomainDiskBusTypeToString(disk->bus)); @@ -3151,6 +3153,19 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, break; + case VIR_DOMAIN_DISK_BUS_NVME: + if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unexpected address type for nvme disk")); + return -1; + } + if (!disk->serial) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("serial property must be specified for nvme disk")); + return -1; + } + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: @@ -3339,6 +3354,7 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_NVME: break; case VIR_DOMAIN_DISK_BUS_IDE: diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18b2b2c8..30eec56941 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -10344,6 +10344,7 @@ testDomainAttachDeviceDiskLiveInternal(testDriver *driver G_GNUC_UNUSED, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -10784,6 +10785,7 @@ testDomainDetachPrepDisk(virDomainObj *vm, case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_NVME: break; case VIR_DOMAIN_DISK_BUS_IDE: diff --git a/src/util/virutil.c b/src/util/virutil.c index 2abcb282fe..521c91d043 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -327,7 +327,7 @@ int virDiskNameParse(const char *name, int *disk, int *partition) const char *ptr = NULL; char *rem; int idx = 0; - static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd"}; + static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd", "nvme"}; size_t i; size_t n_digits; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index de3c9989a5..f0e88874da 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -1238,6 +1238,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDriver *data, IMachine *machine) case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: vboxReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 23a8a35360..b66aeea5c5 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2249,6 +2249,7 @@ virVMXGenerateDiskTarget(virDomainDiskDef *def, case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported bus type '%1$s' for device type '%2$s'"), virDomainDiskBusTypeToString(def->bus), -- 2.11.0

From: ray <honglei.wang@smartx.com> This patch extends the previous NVMe disk bus support by introducing a new nvme-ns bus type. The nvme-ns bus disk needs to be attached to nvme controller. A controller can contain multiple nvme-ns disk devices. Key changes include: - Add VIR_DOMAIN_DISK_BUS_NVME_NS to disk bus - Add VIR_DOMAIN_CONTROLLER_TYPE_NVME to controller type - Update driver-specific functions to handle nvme-ns disks - Modify disk name parsing to recognize 'nvmens' prefix - Add support for NVMe namespace-specific addressing and controller handling - Implement NVMe controller serial number parsing and formatting Signed-off-by: ray <honglei.wang@smartx.com> --- src/conf/domain_conf.c | 39 +++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++++ src/conf/domain_postparse.c | 2 ++ src/conf/domain_validate.c | 1 + src/conf/virconftypes.h | 2 ++ src/hyperv/hyperv_driver.c | 2 ++ src/qemu/qemu_alias.c | 1 + src/qemu/qemu_command.c | 26 ++++++++++++++++++++++++++ src/qemu/qemu_domain_address.c | 5 +++++ src/qemu/qemu_hotplug.c | 8 ++++++++ src/qemu/qemu_postparse.c | 1 + src/qemu/qemu_validate.c | 12 ++++++++++++ src/test/test_driver.c | 2 ++ src/util/virutil.c | 2 +- src/vbox/vbox_common.c | 2 ++ src/vmx/vmx.c | 1 + 16 files changed, 112 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bc101cca0e..d21cf404e2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -373,6 +373,7 @@ VIR_ENUM_IMPL(virDomainDiskBus, "sata", "sd", "nvme", + "nvme-ns", ); VIR_ENUM_IMPL(virDomainDiskCache, @@ -421,6 +422,7 @@ VIR_ENUM_IMPL(virDomainController, "pci", "xenbus", "isa", + "nvme", ); VIR_ENUM_IMPL(virDomainControllerModelPCI, @@ -2545,6 +2547,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; } @@ -6773,6 +6776,14 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt G_GNUC_UNUSED, def->info.addr.drive.unit = idx % 2; break; + case VIR_DOMAIN_DISK_BUS_NVME_NS: + /* For NVME-NS, each nvme controller has a maximum of 256 nvme-ns */ + def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; + def->info.addr.drive.controller = idx / 256; + def->info.addr.drive.bus = 0; + def->info.addr.drive.unit = idx % 256; + break; + case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: @@ -8513,6 +8524,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; } @@ -8541,6 +8553,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; } @@ -8561,6 +8574,8 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt, int ntargetNodes = 0; g_autofree xmlNodePtr *modelNodes = NULL; int nmodelNodes = 0; + g_autofree xmlNodePtr *serialNodes = NULL; + int nserialNodes = 0; int numaNode = -1; int ports; VIR_XPATH_NODE_AUTORESTORE(ctxt) @@ -8696,6 +8711,18 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt, if (virXMLPropInt(node, "ports", 10, VIR_XML_PROP_NONNEGATIVE, &ports, -1) < 0) return NULL; + if ((nserialNodes = virXPathNodeSet("./serial", ctxt, &serialNodes)) > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Multiple <serial> elements in controller definition not allowed")); + return NULL; + } + + if (nserialNodes == 1) { + if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_NVME) { + def->opts.nvmeopts.serial = virXMLNodeContentString(serialNodes[0]); + } + } + switch (def->type) { case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: { if (virXMLPropInt(node, "vectors", 10, VIR_XML_PROP_NONNEGATIVE, @@ -8781,6 +8808,7 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt, 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: default: break; @@ -14718,6 +14746,10 @@ virDomainDiskControllerMatch(int controller_type, int disk_bus) disk_bus == VIR_DOMAIN_DISK_BUS_SATA) return true; + if (controller_type == VIR_DOMAIN_CONTROLLER_TYPE_NVME && + disk_bus == VIR_DOMAIN_DISK_BUS_NVME_NS) + return true; + return false; } @@ -23650,6 +23682,12 @@ virDomainControllerDefFormat(virBuffer *buf, } break; + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: + if (def->opts.nvmeopts.serial != NULL) { + virBufferAsprintf(&childBuf, "<serial>%s</serial>\n", def->opts.nvmeopts.serial); + } + break; + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: if (virDomainControllerDefFormatPCI(&childBuf, def, flags) < 0) return -1; @@ -29204,6 +29242,7 @@ virDiskNameToBusDeviceIndex(virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_LAST: default: *busIdx = 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5cde6783c2..66e1876d08 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -402,6 +402,7 @@ typedef enum { VIR_DOMAIN_DISK_BUS_SATA, VIR_DOMAIN_DISK_BUS_SD, VIR_DOMAIN_DISK_BUS_NVME, + VIR_DOMAIN_DISK_BUS_NVME_NS, VIR_DOMAIN_DISK_BUS_LAST } virDomainDiskBus; @@ -600,6 +601,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; @@ -755,6 +757,10 @@ struct _virDomainXenbusControllerOpts { int maxEventChannels; /* -1 == undef */ }; +struct _virDomainNVMeControllerOpts { + char *serial; +}; + /* Stores the virtual disk controller configuration */ struct _virDomainControllerDef { virDomainControllerType type; @@ -770,6 +776,7 @@ struct _virDomainControllerDef { virDomainPCIControllerOpts pciopts; virDomainUSBControllerOpts usbopts; virDomainXenbusControllerOpts xenbusopts; + virDomainNVMeControllerOpts nvmeopts; } opts; virDomainDeviceInfo info; virDomainVirtioOptions *virtio; diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index a07ec8d94e..e1fbcef485 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -523,6 +523,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk, disk->bus = VIR_DOMAIN_DISK_BUS_XEN; else if (STRPREFIX(disk->dst, "ubd")) disk->bus = VIR_DOMAIN_DISK_BUS_UML; + else if (STRPREFIX(disk->dst, "nvmens")) + disk->bus = VIR_DOMAIN_DISK_BUS_NVME_NS; else if (STRPREFIX(disk->dst, "nvme")) disk->bus = VIR_DOMAIN_DISK_BUS_NVME; } diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 4c96d7cacd..0ad33d08df 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -268,6 +268,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus, case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_LAST: return true; } diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 59be61cea4..83018ad364 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -272,6 +272,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/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 708e10b7dc..e932a5e8a7 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -949,6 +949,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomainDef *def, const char *ho case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported controller type")); @@ -3092,6 +3093,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid disk bus in definition")); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 9d39ebd63d..894274f890 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -259,6 +259,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SCSI: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: diskPriv->qomName = g_strdup(disk->info.alias); break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7b33fa1bec..7a766228db 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -537,6 +537,17 @@ qemuBuildDeviceAddresDriveProps(virJSONValue *props, } break; + case VIR_DOMAIN_DISK_BUS_NVME_NS: + if (!(controllerAlias = virDomainControllerAliasFind(domainDef, + VIR_DOMAIN_CONTROLLER_TYPE_NVME, + info->addr.drive.controller))) + return -1; + + if (virJSONValueObjectAdd(&props, + "s:bus", controllerAlias, + NULL) < 0) + return -1; + break; case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_USB: @@ -1738,6 +1749,10 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, driver = "nvme"; break; + case VIR_DOMAIN_DISK_BUS_NVME_NS: + driver = "nvme-ns"; + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: @@ -2775,6 +2790,16 @@ 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, + NULL) < 0) + return -1; + + break; + case VIR_DOMAIN_CONTROLLER_TYPE_IDE: case VIR_DOMAIN_CONTROLLER_TYPE_FDC: case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: @@ -2937,6 +2962,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 df17afb5b9..ac5ccf8f2a 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -616,6 +616,9 @@ 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: @@ -741,6 +744,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: return 0; @@ -1922,6 +1926,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 2673c6818a..301f2fc704 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1053,6 +1053,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver, /* Note that SD card hotplug support should be added only once * they support '-device' (don't require -drive only). * See also: qemuDiskBusIsSD */ + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -5733,6 +5734,7 @@ qemuDomainDetachPrepDisk(virDomainObj *vm, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME_NS: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("This type of disk cannot be hot unplugged")); return -1; @@ -5807,6 +5809,11 @@ qemuDomainDiskControllerIsBusy(virDomainObj *vm, continue; break; + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: + if (disk->bus != VIR_DOMAIN_DISK_BUS_NVME_NS) + continue; + break; + case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: /* xenbus is not supported by the qemu driver */ continue; @@ -5863,6 +5870,7 @@ qemuDomainControllerIsBusy(virDomainObj *vm, case VIR_DOMAIN_CONTROLLER_TYPE_USB: case VIR_DOMAIN_CONTROLLER_TYPE_PCI: case VIR_DOMAIN_CONTROLLER_TYPE_ISA: + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: /* detach of the controller types above is not yet supported */ return false; diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index 49009ae2e4..1513489ab0 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 e7e00fa761..ffa9dcd3cc 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2823,6 +2823,7 @@ qemuValidateDomainDeviceDefDiskIOThreads(const virDomainDef *def, case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOThreads not available for bus %1$s target %2$s"), @@ -3038,6 +3039,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("disk device='lun' is not supported for bus='%1$s'"), virDomainDiskBusTypeToString(disk->bus)); @@ -3166,6 +3168,14 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, } break; + case VIR_DOMAIN_DISK_BUS_NVME_NS: + if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unexpected address type for nvme-ns disk")); + return -1; + } + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: @@ -3355,6 +3365,7 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk, case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_SCSI: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: break; case VIR_DOMAIN_DISK_BUS_IDE: @@ -4356,6 +4367,7 @@ qemuValidateDomainDeviceDefController(const virDomainControllerDef *controller, case VIR_DOMAIN_CONTROLLER_TYPE_USB: 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/test/test_driver.c b/src/test/test_driver.c index 30eec56941..0b6a57d595 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -10345,6 +10345,7 @@ testDomainAttachDeviceDiskLiveInternal(testDriver *driver G_GNUC_UNUSED, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -10794,6 +10795,7 @@ testDomainDetachPrepDisk(virDomainObj *vm, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_NVME_NS: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("This type of disk cannot be hot unplugged")); return -1; diff --git a/src/util/virutil.c b/src/util/virutil.c index 521c91d043..249d5e803b 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -327,7 +327,7 @@ int virDiskNameParse(const char *name, int *disk, int *partition) const char *ptr = NULL; char *rem; int idx = 0; - static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd", "nvme"}; + static char const* const drive_prefix[] = {"fd", "hd", "vd", "sd", "xvd", "ubd", "nvmens", "nvme"}; size_t i; size_t n_digits; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index f0e88874da..16cf2928b6 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"), @@ -1239,6 +1240,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDriver *data, IMachine *machine) case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: vboxReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index b66aeea5c5..cd8c1f6c59 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2250,6 +2250,7 @@ virVMXGenerateDiskTarget(virDomainDiskDef *def, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NVME: + case VIR_DOMAIN_DISK_BUS_NVME_NS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported bus type '%1$s' for device type '%2$s'"), virDomainDiskBusTypeToString(def->bus), -- 2.11.0

From: ray <honglei.wang@smartx.com> This patch extends QEMU capabilities support for nvme and nvme-ns disks. Signed-off-by: ray <honglei.wang@smartx.com> --- src/qemu/qemu_capabilities.c | 10 ++++++++++ src/qemu/qemu_capabilities.h | 2 ++ src/qemu/qemu_validate.c | 12 ++++++++++++ tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_10.0.0.s390x.xml | 2 ++ tests/domaincapsdata/qemu_10.0.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0.ppc64.xml | 2 ++ tests/domaincapsdata/qemu_5.2.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_6.0.0.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_6.0.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.1.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 2 ++ tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 2 ++ tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 2 ++ tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0.ppc.xml | 2 ++ tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0.s390x.xml | 2 ++ tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0.s390x.xml | 2 ++ tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml | 2 ++ tests/domaincapsdata/qemu_9.2.0.s390x.xml | 2 ++ tests/domaincapsdata/qemu_9.2.0.x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 2 ++ tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 2 ++ tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml | 2 ++ tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 2 ++ tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 2 ++ tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 2 ++ tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 2 ++ tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 2 ++ 111 files changed, 240 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 23b466c36e..2b4793e509 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -728,6 +728,8 @@ VIR_ENUM_IMPL(virQEMUCaps, "machine.virt.aia", /* QEMU_CAPS_MACHINE_VIRT_AIA */ "virtio-mem-ccw", /* QEMU_CAPS_DEVICE_VIRTIO_MEM_CCW */ "blockdev-set-active", /* QEMU_CAPS_BLOCKDEV_SET_ACTIVE */ + "nvme", /* QEMU_CAPS_DEVICE_NVME */ + "nvme-ns", /* QEMU_CAPS_DEVICE_NVME_NS */ ); @@ -1418,6 +1420,8 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "sev-snp-guest", QEMU_CAPS_SEV_SNP_GUEST }, { "acpi-erst", QEMU_CAPS_DEVICE_ACPI_ERST }, { "virtio-mem-ccw", QEMU_CAPS_DEVICE_VIRTIO_MEM_CCW }, + { "nvme", QEMU_CAPS_DEVICE_NVME }, + { "nvme-ns", QEMU_CAPS_DEVICE_NVME_NS }, }; @@ -6475,6 +6479,12 @@ virQEMUCapsFillDomainDeviceDiskCaps(virQEMUCaps *qemuCaps, if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_SATA); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVME)) + VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_NVME); + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVME_NS)) + VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_NVME_NS); + /* disk->model values */ VIR_DOMAIN_CAPS_ENUM_SET(disk->model, VIR_DOMAIN_DISK_MODEL_VIRTIO); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL)) { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index ee71331a09..6e425fac43 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -707,6 +707,8 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_MACHINE_VIRT_AIA, /* -machine virt,aia=(none|aplic|aplic-imsic), RISC-V only */ QEMU_CAPS_DEVICE_VIRTIO_MEM_CCW, /* -device virtio-mem-ccw */ QEMU_CAPS_BLOCKDEV_SET_ACTIVE, /* blockdev-set-active QMP command supported */ + QEMU_CAPS_DEVICE_NVME, /* -device nvme */ + QEMU_CAPS_DEVICE_NVME_NS, /* -device nvme-ns */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index ffa9dcd3cc..f224c103d2 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -3156,6 +3156,12 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, break; case VIR_DOMAIN_DISK_BUS_NVME: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVME)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support '-device nvme'")); + return -1; + } + if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected address type for nvme disk")); @@ -3169,6 +3175,12 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, break; case VIR_DOMAIN_DISK_BUS_NVME_NS: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVME_NS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support '-device nvme-ns'")); + return -1; + } + if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected address type for nvme-ns disk")); diff --git a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml index 73cb50e7b6..f2aad1249d 100644 --- a/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0-q35.x86_64.xml @@ -1547,6 +1547,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml index 9a7d39c1f8..c8878126e7 100644 --- a/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0-tcg.x86_64.xml @@ -1655,6 +1655,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_10.0.0.s390x.xml b/tests/domaincapsdata/qemu_10.0.0.s390x.xml index 4af3c7ec53..71dfbe0475 100644 --- a/tests/domaincapsdata/qemu_10.0.0.s390x.xml +++ b/tests/domaincapsdata/qemu_10.0.0.s390x.xml @@ -242,6 +242,8 @@ <value>scsi</value> <value>virtio</value> <value>usb</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml index c06b9d1c51..7ec9562124 100644 --- a/tests/domaincapsdata/qemu_10.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_10.0.0.x86_64.xml @@ -1547,6 +1547,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml index ce3ba14684..84c22cd251 100644 --- a/tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml @@ -883,6 +883,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml b/tests/domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml index ac28059190..1b494224ba 100644 --- a/tests/domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_5.2.0-tcg-virt.riscv64.xml @@ -52,6 +52,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml index 92827056db..4c07b18aad 100644 --- a/tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml @@ -1512,6 +1512,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml index 4708b32b89..36d36062cb 100644 --- a/tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml @@ -99,6 +99,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml b/tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml index d636e5686a..39eaf5828a 100644 --- a/tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_5.2.0-virt.riscv64.xml @@ -55,6 +55,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0.aarch64.xml b/tests/domaincapsdata/qemu_5.2.0.aarch64.xml index 4708b32b89..36d36062cb 100644 --- a/tests/domaincapsdata/qemu_5.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_5.2.0.aarch64.xml @@ -99,6 +99,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0.ppc64.xml b/tests/domaincapsdata/qemu_5.2.0.ppc64.xml index a6daef9798..b33a191ae0 100644 --- a/tests/domaincapsdata/qemu_5.2.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_5.2.0.ppc64.xml @@ -65,6 +65,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_5.2.0.x86_64.xml b/tests/domaincapsdata/qemu_5.2.0.x86_64.xml index 21e8a55a63..f9762d4ce0 100644 --- a/tests/domaincapsdata/qemu_5.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_5.2.0.x86_64.xml @@ -883,6 +883,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml index ba09a6cbb2..b8cb256823 100644 --- a/tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml @@ -905,6 +905,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml index dc15afa017..9d80b1a6ec 100644 --- a/tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml @@ -1602,6 +1602,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml index 74f3a04bb0..9b94a42601 100644 --- a/tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml @@ -100,6 +100,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.0.0.aarch64.xml b/tests/domaincapsdata/qemu_6.0.0.aarch64.xml index 74f3a04bb0..9b94a42601 100644 --- a/tests/domaincapsdata/qemu_6.0.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_6.0.0.aarch64.xml @@ -100,6 +100,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.0.0.x86_64.xml b/tests/domaincapsdata/qemu_6.0.0.x86_64.xml index 72ceb31595..bb4cdf11bd 100644 --- a/tests/domaincapsdata/qemu_6.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.0.0.x86_64.xml @@ -905,6 +905,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml index deaa3a0041..ea8373b096 100644 --- a/tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml @@ -1006,6 +1006,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml index 469752cf32..42f1df4150 100644 --- a/tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml @@ -1799,6 +1799,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.1.0.x86_64.xml b/tests/domaincapsdata/qemu_6.1.0.x86_64.xml index 7484c13f2c..ad932f28a3 100644 --- a/tests/domaincapsdata/qemu_6.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.1.0.x86_64.xml @@ -1006,6 +1006,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml index d1a8399812..0f3556076b 100644 --- a/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml @@ -1012,6 +1012,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml index 8c8f016233..0bb82674c0 100644 --- a/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml @@ -1814,6 +1814,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml index 051d2782b6..8599548714 100644 --- a/tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml @@ -101,6 +101,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0.aarch64.xml b/tests/domaincapsdata/qemu_6.2.0.aarch64.xml index 051d2782b6..8599548714 100644 --- a/tests/domaincapsdata/qemu_6.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_6.2.0.aarch64.xml @@ -101,6 +101,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0.ppc64.xml b/tests/domaincapsdata/qemu_6.2.0.ppc64.xml index 39b07955dd..36df923a8e 100644 --- a/tests/domaincapsdata/qemu_6.2.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_6.2.0.ppc64.xml @@ -65,6 +65,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml index 1f21b8be4e..1f250e8e7a 100644 --- a/tests/domaincapsdata/qemu_6.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_6.2.0.x86_64.xml @@ -1012,6 +1012,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml b/tests/domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml index bf130dde10..18fb66e6a6 100644 --- a/tests/domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml +++ b/tests/domaincapsdata/qemu_7.0.0-hvf.aarch64+hvf.xml @@ -60,6 +60,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml index 2c5129453e..8686efcbca 100644 --- a/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml @@ -1039,6 +1039,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml index d4a567f5c6..bc67ed6ecd 100644 --- a/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml @@ -1838,6 +1838,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml index 4c49343c43..f2b813c092 100644 --- a/tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml @@ -101,6 +101,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0.aarch64.xml b/tests/domaincapsdata/qemu_7.0.0.aarch64.xml index 4c49343c43..f2b813c092 100644 --- a/tests/domaincapsdata/qemu_7.0.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_7.0.0.aarch64.xml @@ -101,6 +101,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml index 52c73d10a4..1c7908c000 100644 --- a/tests/domaincapsdata/qemu_7.0.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_7.0.0.ppc64.xml @@ -65,6 +65,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml index 6fa08af994..303b135def 100644 --- a/tests/domaincapsdata/qemu_7.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.0.0.x86_64.xml @@ -1039,6 +1039,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml index 8bed31ad22..a1060f62d8 100644 --- a/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml @@ -1006,6 +1006,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml index cb7fd8811b..9c3311275e 100644 --- a/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml @@ -1786,6 +1786,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml index ca0bc6f0b5..0799182fca 100644 --- a/tests/domaincapsdata/qemu_7.1.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_7.1.0.ppc64.xml @@ -60,6 +60,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml index a0f8b13f72..c5f8c10602 100644 --- a/tests/domaincapsdata/qemu_7.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.1.0.x86_64.xml @@ -1006,6 +1006,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml index 75b2f1102d..412012f0c4 100644 --- a/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml +++ b/tests/domaincapsdata/qemu_7.2.0-hvf.x86_64+hvf.xml @@ -63,6 +63,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml index f9d27024fc..e50513547e 100644 --- a/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml @@ -1011,6 +1011,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml index c7728ac454..9dd2ead2fb 100644 --- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml +++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64+hvf.xml @@ -1491,6 +1491,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml index c7728ac454..9dd2ead2fb 100644 --- a/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml @@ -1491,6 +1491,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0.ppc.xml b/tests/domaincapsdata/qemu_7.2.0.ppc.xml index c6ef37b1af..9492fb2c26 100644 --- a/tests/domaincapsdata/qemu_7.2.0.ppc.xml +++ b/tests/domaincapsdata/qemu_7.2.0.ppc.xml @@ -54,6 +54,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml index f0d9493353..286e1c1287 100644 --- a/tests/domaincapsdata/qemu_7.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_7.2.0.x86_64.xml @@ -1011,6 +1011,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml index b8c376cb14..048e3e813e 100644 --- a/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-q35.x86_64.xml @@ -1093,6 +1093,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml b/tests/domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml index 7a9da4fe4f..121622404c 100644 --- a/tests/domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-tcg-virt.riscv64.xml @@ -52,6 +52,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml index d3c9830a1a..9281e3ce43 100644 --- a/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-tcg.x86_64.xml @@ -1586,6 +1586,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml b/tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml index 258df5b134..be8e25bea4 100644 --- a/tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_8.0.0-virt.riscv64.xml @@ -55,6 +55,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml index e8df30ae07..d87ef654dd 100644 --- a/tests/domaincapsdata/qemu_8.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.0.0.x86_64.xml @@ -1093,6 +1093,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml index e80e175376..f4ee234183 100644 --- a/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0-q35.x86_64.xml @@ -1352,6 +1352,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml index 62ffabb3e2..cce17538a0 100644 --- a/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0-tcg.x86_64.xml @@ -1608,6 +1608,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml index 4117d926cb..acff323d2c 100644 --- a/tests/domaincapsdata/qemu_8.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.1.0.x86_64.xml @@ -1352,6 +1352,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml index dfa88bcf96..51a531c0b8 100644 --- a/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-q35.x86_64.xml @@ -1353,6 +1353,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml index c9f01904cd..04c7c687b0 100644 --- a/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-tcg-virt.loongarch64.xml @@ -61,6 +61,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml index 327cad253e..8c391e717d 100644 --- a/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-tcg.x86_64.xml @@ -1574,6 +1574,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml index 224c619168..0ae487756d 100644 --- a/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-virt.aarch64.xml @@ -109,6 +109,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml index ed3637eaec..ccd1b6e016 100644 --- a/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0-virt.loongarch64.xml @@ -65,6 +65,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml index 224c619168..0ae487756d 100644 --- a/tests/domaincapsdata/qemu_8.2.0.aarch64.xml +++ b/tests/domaincapsdata/qemu_8.2.0.aarch64.xml @@ -109,6 +109,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml index 7182dca796..3bfe02fa85 100644 --- a/tests/domaincapsdata/qemu_8.2.0.armv7l.xml +++ b/tests/domaincapsdata/qemu_8.2.0.armv7l.xml @@ -58,6 +58,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0.s390x.xml b/tests/domaincapsdata/qemu_8.2.0.s390x.xml index 57ac07c153..51cd020200 100644 --- a/tests/domaincapsdata/qemu_8.2.0.s390x.xml +++ b/tests/domaincapsdata/qemu_8.2.0.s390x.xml @@ -331,6 +331,8 @@ <value>scsi</value> <value>virtio</value> <value>usb</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml index f8dbb717f1..e60cede4cc 100644 --- a/tests/domaincapsdata/qemu_8.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_8.2.0.x86_64.xml @@ -1353,6 +1353,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml index c5a653f57b..df05e36421 100644 --- a/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0-q35.x86_64.xml @@ -1353,6 +1353,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml index 30876c5fef..f45f37582c 100644 --- a/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0-tcg.x86_64.xml @@ -1503,6 +1503,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml index 6c141e1cb9..f9b6d8397c 100644 --- a/tests/domaincapsdata/qemu_9.0.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.0.0.x86_64.xml @@ -1353,6 +1353,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml index 9445d999b5..395bb987f1 100644 --- a/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-q35.x86_64.xml @@ -1489,6 +1489,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml b/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml index b4327bf878..b6dc4f5607 100644 --- a/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-tcg-virt.riscv64.xml @@ -71,6 +71,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml index 61d92550c1..d1c57e7432 100644 --- a/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-tcg.x86_64.xml @@ -1608,6 +1608,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml b/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml index 73e5ba1bc3..81e8f6d0bf 100644 --- a/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml +++ b/tests/domaincapsdata/qemu_9.1.0-virt.riscv64.xml @@ -60,6 +60,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0.s390x.xml b/tests/domaincapsdata/qemu_9.1.0.s390x.xml index be46cfe6ba..7a8626c111 100644 --- a/tests/domaincapsdata/qemu_9.1.0.s390x.xml +++ b/tests/domaincapsdata/qemu_9.1.0.s390x.xml @@ -194,6 +194,8 @@ <value>scsi</value> <value>virtio</value> <value>usb</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml index 5e87efe5e8..ca79e2f120 100644 --- a/tests/domaincapsdata/qemu_9.1.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.1.0.x86_64.xml @@ -1489,6 +1489,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml index 98c522f0fc..46c87a63cf 100644 --- a/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0-q35.x86_64.xml @@ -1547,6 +1547,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml index 7ccdc11412..7d4268f6b4 100644 --- a/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0-tcg.x86_64.xml @@ -1655,6 +1655,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.2.0.s390x.xml b/tests/domaincapsdata/qemu_9.2.0.s390x.xml index e13809bc63..553e93a988 100644 --- a/tests/domaincapsdata/qemu_9.2.0.s390x.xml +++ b/tests/domaincapsdata/qemu_9.2.0.s390x.xml @@ -194,6 +194,8 @@ <value>scsi</value> <value>virtio</value> <value>usb</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml index 0b5162781e..c23303e457 100644 --- a/tests/domaincapsdata/qemu_9.2.0.x86_64.xml +++ b/tests/domaincapsdata/qemu_9.2.0.x86_64.xml @@ -1547,6 +1547,8 @@ <value>virtio</value> <value>usb</value> <value>sata</value> + <value>nvme</value> + <value>nvme-ns</value> </enum> <enum name='model'> <value>virtio</value> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml index bccce19bfc..ce1f8270fe 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml @@ -142,6 +142,8 @@ <flag name='query-cpu-model-expansion.deprecated-props'/> <flag name='migrate-incoming.exit-on-error'/> <flag name='virtio-mem-ccw'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9002050</version> <microcodeVersion>39100285</microcodeVersion> <package>v9.2.0-1203-gd6430c17d7</package> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml index b1cf477bdc..f84380acc0 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml @@ -212,6 +212,8 @@ <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> <flag name='blockdev-set-active'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9002050</version> <microcodeVersion>43100285</microcodeVersion> <package>v9.2.0-1636-gffaf7f0376</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml index ae426c5f7f..8cc6e01992 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml @@ -127,6 +127,8 @@ <flag name='usb-mtp'/> <flag name='machine.virt.ras'/> <flag name='netdev.user'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>5002000</version> <microcodeVersion>61700243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml index d7615208b3..e3e072c819 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml @@ -127,6 +127,8 @@ <flag name='virtio-crypto'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>5002000</version> <microcodeVersion>42900243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml index c3452815b4..596dbbcf19 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml @@ -119,6 +119,8 @@ <flag name='virtio-crypto'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>5002000</version> <microcodeVersion>0</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml index 4cd05fa7ec..b7b34e3438 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml @@ -161,6 +161,8 @@ <flag name='virtio-crypto'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>5002000</version> <microcodeVersion>43100243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml index a02018a467..8939363942 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml @@ -139,6 +139,8 @@ <flag name='machine.virt.ras'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6000000</version> <microcodeVersion>61700242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml index a8897fb80b..303257eb5f 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml @@ -174,6 +174,8 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6000000</version> <microcodeVersion>43100242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml index 0f2995a2d3..a886333210 100644 --- a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml @@ -180,6 +180,8 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6001000</version> <microcodeVersion>43100243</microcodeVersion> <package>v6.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml index 5624ad95a1..32ea06c420 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml @@ -152,6 +152,8 @@ <flag name='machine.virt.ras'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6001050</version> <microcodeVersion>61700244</microcodeVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml index d4172c3146..8f6a9c1c03 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml @@ -140,6 +140,8 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6002000</version> <microcodeVersion>42900244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml index 582b0e9b52..c663541ab5 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml @@ -182,6 +182,8 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6002000</version> <microcodeVersion>43100244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml index 8bdb26e8a4..00cb533f85 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml @@ -161,6 +161,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml index 697c1c255a..e1afe4f253 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml @@ -161,6 +161,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml index e02f42c5e0..4754f9f476 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml @@ -159,6 +159,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7000000</version> <microcodeVersion>42900243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml index fd317a9afa..69e1dd112c 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml @@ -190,6 +190,8 @@ <flag name='acpi-erst'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7000000</version> <microcodeVersion>43100243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml index 427aa1ace9..3656739f32 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml @@ -160,6 +160,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7001000</version> <microcodeVersion>42900244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml index 32e4e8e1bb..a6040acbeb 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml @@ -195,6 +195,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7001000</version> <microcodeVersion>43100244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml index 56cb66d394..8d1c49ae8d 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml @@ -155,6 +155,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-7.2.0-6.fc37</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml index 0ebcb94a31..168fe1d0c9 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml @@ -199,6 +199,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml index 025ced01d9..09d99ec0ee 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml @@ -199,6 +199,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml index 0207637ebc..35f3ba11a5 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml @@ -143,6 +143,8 @@ <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> <flag name='machine.virt.aia'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>7002050</version> <microcodeVersion>0</microcodeVersion> <package>v7.2.0-333-g222059a0fc</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml index 5f45788b77..27d5bd1b8f 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml @@ -203,6 +203,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8000000</version> <microcodeVersion>43100244</microcodeVersion> <package>v8.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml index 7dee7f94c2..12912d9a15 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml @@ -205,6 +205,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8001000</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml index 78082dbf3f..beb384abce 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml @@ -170,6 +170,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8002000</version> <microcodeVersion>61700246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml index 912eb45db6..8dac79438d 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml @@ -177,6 +177,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-8.2.0-7.fc39</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml index 60b980e256..ab2a6da20e 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml @@ -160,6 +160,8 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8002000</version> <microcodeVersion>106300246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml index 8f36104080..ad77169fc4 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml @@ -124,6 +124,8 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8002000</version> <microcodeVersion>39100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml index 51e14736cd..fbbc1af5db 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml @@ -208,6 +208,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>8002000</version> <microcodeVersion>43100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index 4b64547b11..7fcbc8e351 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -210,6 +210,8 @@ <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9000000</version> <microcodeVersion>43100245</microcodeVersion> <package>v9.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml index ccc7673ba9..5d534cb2ea 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml @@ -170,6 +170,8 @@ <flag name='snapshot-internal-qmp'/> <flag name='migrate-incoming.exit-on-error'/> <flag name='machine.virt.aia'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9001000</version> <microcodeVersion>0</microcodeVersion> <package>v9.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index a20b63051e..269eb9f67e 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -135,6 +135,8 @@ <flag name='snapshot-internal-qmp'/> <flag name='query-cpu-model-expansion.deprecated-props'/> <flag name='migrate-incoming.exit-on-error'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9001000</version> <microcodeVersion>39100246</microcodeVersion> <package>v9.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml index 196bab7797..1f7005fd76 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml @@ -209,6 +209,8 @@ <flag name='machine-i8042-opt'/> <flag name='snapshot-internal-qmp'/> <flag name='migrate-incoming.exit-on-error'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9001000</version> <microcodeVersion>43100246</microcodeVersion> <package>v9.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 767a95bd3e..be52af4ccc 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -138,6 +138,8 @@ <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='query-cpu-model-expansion.deprecated-props'/> <flag name='migrate-incoming.exit-on-error'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9001050</version> <microcodeVersion>39100247</microcodeVersion> <package>v9.1.0-1348-g11b8920ed2</package> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml index 824504dba0..5c647f19c8 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml @@ -211,6 +211,8 @@ <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> + <flag name='nvme'/> + <flag name='nvme-ns'/> <version>9002000</version> <microcodeVersion>43100247</microcodeVersion> <package>v9.2.0</package> -- 2.11.0

From: ray <honglei.wang@smartx.com> Update documentation to include nvme and nvme-ns disk bus types: - Add "nvme" and "nvme-ns" to the list of supported disk bus types - Extend the allowed disk target device patterns to include nvme and nvmens prefixes Signed-off-by: ray <honglei.wang@smartx.com> --- docs/formatdomain.rst | 5 +++-- src/conf/schemas/domaincommon.rng | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 381bf84f67..92d3c58503 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -3248,7 +3248,8 @@ paravirtualized driver is specified via the ``disk`` element. name in the guest OS. Treat it as a device ordering hint. The optional ``bus`` attribute specifies the type of disk device to emulate; possible values are driver specific, with typical values being "ide", "scsi", - "virtio", "xen", "usb", "sata", or "sd" :since:`"sd" since 1.1.2`. If + "virtio", "xen", "usb", "sata", "sd" :since:`"sd" since 1.1.2`, "nvme" or + "nvme-ns":since:`"nvme" and "nvme-ns" since 11.1.0`. If omitted, the bus type is inferred from the style of the device name (e.g. a device named 'sda' will typically be exported using a SCSI bus). The optional attribute ``tray`` indicates the tray status of the removable disks (i.e. @@ -4047,7 +4048,7 @@ device hotplug is expected. ... Each controller has a mandatory attribute ``type``, which must be one of 'ide', -'fdc', 'scsi', 'sata', 'usb', 'ccid', 'virtio-serial' or 'pci', and a mandatory +'fdc', 'scsi', 'sata', 'usb', 'ccid', 'virtio-serial', 'pci' or "nvme", and a mandatory attribute ``index`` which is the decimal integer describing in which order the bus controller is encountered (for use in ``controller`` attributes of ``<address>`` elements). :since:`Since 1.3.5` the index is optional; if not diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 3328a63205..afa98d5266 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -2520,7 +2520,7 @@ <define name="diskTargetDev"> <data type="string"> - <param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+</param> + <param name="pattern">(ioemu:)?(fd|hd|sd|vd|xvd|ubd|nvmens|nvme)[a-zA-Z0-9_]+</param> </data> </define> @@ -2541,6 +2541,8 @@ <value>uml</value> <!-- NOT USED ANYMORE --> <value>sata</value> <value>sd</value> + <value>nvme</value> + <value>nvme-ns</value> </choice> </attribute> </optional> @@ -3046,6 +3048,14 @@ </attribute> </optional> </group> + <group> + <attribute name="type"> + <value>nvme</value> + </attribute> + <element name="serial"> + <ref name="diskSerial"/> + </element> + </group> </choice> <optional> <element name="driver"> -- 2.11.0

From: ray <honglei.wang@smartx.com> This completes the test coverage for the recently added NVMe disk bus support. Signed-off-by: ray <honglei.wang@smartx.com> --- .../disk-nvme-device.x86_64-latest.args | 38 +++++++++++++++++ .../disk-nvme-device.x86_64-latest.xml | 49 ++++++++++++++++++++++ tests/qemuxmlconfdata/disk-nvme-device.xml | 46 ++++++++++++++++++++ tests/qemuxmlconftest.c | 1 + 4 files changed, 134 insertions(+) create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/disk-nvme-device.xml diff --git a/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.args b/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.args new file mode 100644 index 0000000000..2ac720b676 --- /dev/null +++ b/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-accel tcg \ +-cpu qemu64 \ +-m size=219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-device '{"driver":"virtio-scsi-pci","id":"scsi0","bus":"pci.0","addr":"0x3"}' \ +-device '{"driver":"nvme","id":"nvme0","serial":"nvme-controller-abcdef","bus":"pci.0","addr":"0x5"}' \ +-blockdev '{"driver":"file","filename":"/tmp/data-1.img","node-name":"libvirt-2-storage","read-only":false}' \ +-device '{"driver":"nvme","bus":"pci.0","addr":"0x2","drive":"libvirt-2-storage","id":"nvme-disk0","bootindex":1,"serial":"nvme-abcdef"}' \ +-blockdev '{"driver":"file","filename":"/tmp/data-2.img","node-name":"libvirt-1-storage","read-only":false}' \ +-device '{"driver":"nvme-ns","bus":"nvme0","drive":"libvirt-1-storage","id":"nvme-ns0-0-0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.xml new file mode 100644 index 0000000000..3f3c1a253e --- /dev/null +++ b/tests/qemuxmlconfdata/disk-nvme-device.x86_64-latest.xml @@ -0,0 +1,49 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</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> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='raw'/> + <source file='/tmp/data-1.img'/> + <target dev='nvmea' bus='nvme'/> + <serial>nvme-abcdef</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='raw'/> + <source file='/tmp/data-2.img'/> + <target dev='nvmensa' bus='nvme-ns'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <controller type='scsi' index='0' model='virtio-scsi'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </controller> + <controller type='nvme' index='0'> + <serial>nvme-controller-abcdef</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </controller> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/disk-nvme-device.xml b/tests/qemuxmlconfdata/disk-nvme-device.xml new file mode 100644 index 0000000000..27aa973677 --- /dev/null +++ b/tests/qemuxmlconfdata/disk-nvme-device.xml @@ -0,0 +1,46 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</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> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <source file='/tmp/data-1.img'/> + <target dev='nvmea' bus='nvme'/> + <serial>nvme-abcdef</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <source file='/tmp/data-2.img'/> + <target dev='nvmensa' bus='nvme-ns'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <controller type='scsi' index='0' model='virtio-scsi'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </controller> + <controller type='nvme' index='0'> + <serial>nvme-controller-abcdef</serial> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </controller> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index c271170d25..c3d38180e6 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -1606,6 +1606,7 @@ mymain(void) DO_TEST_CAPS_LATEST("disk-network-ssh"); DO_TEST_CAPS_LATEST("disk-no-boot"); DO_TEST_CAPS_LATEST("disk-nvme"); + DO_TEST_CAPS_LATEST("disk-nvme-device"); DO_TEST_CAPS_LATEST("disk-vhostuser-numa"); DO_TEST_CAPS_LATEST("disk-vhostuser"); DO_TEST_CAPS_ARCH_LATEST_FULL("disk-vhostvdpa", "x86_64", -- 2.11.0

On Tue, Feb 18, 2025 at 07:45:45PM +0800, honglei.wang@smartx.com wrote:
From: hongleiwang <honglei.wang@smartx.com>
QEMU has supported nvme disk emulation for a long time, see: https://qemu-project.gitlab.io/qemu/system/devices/nvme.html.
The following patches introduce nvme and nvme-ns disk bus type: A disk with nvme as bus is represented as nvme disk that contains only one nvme namespace. In XML, it can be used like this: <devices> ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> <target dev='nvmea' bus='nvme'/> <serial>nvme-serial-value</serial> </disk> ... </devices>
A disk with nvme-ns as bus is represented as an nvme namespace and needs to be attached to an nvme controller. In XML, it can be used like this: <devices> ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/tmp/data.img'/> <target dev='nvmensa' bus='nvme-ns'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='nvme' index='0'> <serial>nvme-controller-serial-value</serial> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </controller> ... </devices>
What is the reason for wanting to have both these config approaches ? With the first appearing to be a subset of the second, the first seems to lack a compelling reason to exist. Consider if someone deployed a VM with the first config style and then later wanted to add a 2nd namespace to the VM. They would have to rewrite their config to the second form anyway. It seems like we'd be better off only supportnig the second approach as it is more general. With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Tue, Feb 18, 2025 at 07:45:45PM +0800, honglei.wang(a)smartx.com wrote:
What is the reason for wanting to have both these config approaches ? With the first appearing to be a subset of the second, the first seems to lack a compelling reason to exist.
Consider if someone deployed a VM with the first config style and then later wanted to add a 2nd namespace to the VM. They would have to rewrite their config to the second form anyway.
It seems like we'd be better off only supportnig the second approach as it is more general.
With regards, Daniel
Thank you for your thoughtful feedback. The key difference between these two approaches lies in how libvirt perceives the disk device. In the first approach, the disk is an NVMe device itself, while in the second approach, the disk represents an NVMe namespace (nvme-ns) device. A notable consequence of this distinction is that NVMe namespaces cannot be hot-plugged now. This means that in the first approach, libvirt can hot-plug and hot-unplug the 'disk', whereas in the second approach, libvirt can only hot-plug the NVMe controller, not the disk. The first approach offers greater flexibility in usage, similar to a virtio disk, whereas the second approach allows more flexible namespace configurations but restricts hot-plugging to the controller level. If this distinction is deemed insignificant, I am happy to remove the first approach from the patch. Thank you again for your valuable suggestions. I look forward to your thoughts on this.

On Thu, Feb 20, 2025 at 11:35:01AM -0000, honglei.wang@smartx.com wrote:
On Tue, Feb 18, 2025 at 07:45:45PM +0800, honglei.wang(a)smartx.com wrote:
What is the reason for wanting to have both these config approaches ? With the first appearing to be a subset of the second, the first seems to lack a compelling reason to exist.
Consider if someone deployed a VM with the first config style and then later wanted to add a 2nd namespace to the VM. They would have to rewrite their config to the second form anyway.
It seems like we'd be better off only supportnig the second approach as it is more general.
With regards, Daniel
Thank you for your thoughtful feedback.
The key difference between these two approaches lies in how libvirt perceives the disk device. In the first approach, the disk is an NVMe device itself, while in the second approach, the disk represents an NVMe namespace (nvme-ns) device.
A notable consequence of this distinction is that NVMe namespaces cannot be hot-plugged now. This means that in the first approach, libvirt can hot-plug and hot-unplug the 'disk', whereas in the second approach, libvirt can only hot-plug the NVMe controller, not the disk. The first approach offers greater flexibility in usage, similar to a virtio disk, whereas the second approach allows more flexible namespace configurations but restricts hot-plugging to the controller level.
The first approach can be rewritten to the second one and is only an easier to write way. I would suggest we use the second one and we can add a functionality which will rewrite the first one to the second one upon definition. To make it easier to unplug we could, theoretically, see if the disk is the only namespace of the controller and unplug that, but that's just a nice-to-have, I guess.
If this distinction is deemed insignificant, I am happy to remove the first approach from the patch.
Thank you again for your valuable suggestions. I look forward to your thoughts on this.

On Thu, Feb 20, 2025 at 11:35:01AM -0000, honglei.wang(a)smartx.com wrote:
The first approach can be rewritten to the second one and is only an easier to write way. I would suggest we use the second one and we can add a functionality which will rewrite the first one to the second one upon definition. To make it easier to unplug we could, theoretically, see if the disk is the only namespace of the controller and unplug that, but that's just a nice-to-have, I guess. Yes, the latter is more general, and I agree that unifying to the second approach makes sense. I will submit another patch that only includes the second approach. As for hot-unplugging behavior, we can optimize it in the future if needed, as Martin mentioned.
participants (3)
-
Daniel P. Berrangé
-
honglei.wang@smartx.com
-
Martin Kletzander