From nobody Tue May 14 10:52:48 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=bytedance.com ARC-Seal: i=1; a=rsa-sha256; t=1620877566; cv=none; d=zohomail.com; s=zohoarc; b=ERgKeZ61CVO2ClXlRKy9+mZrpWttXWnVbg6PYfWrsddbdj01QVwoRrIloaOoirJaEemezd4wJqQbDBaNIYJNt3OSLozL4IWytNyuRCJoyjZQ5mKancSjU5SMas0tlzotgFNhuhtf3FkIGzkYmtkyQ+9vA0ECRPzYBkXVe/u/9nI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1620877566; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=NJpxulCklelCzE7pDfP9TrTS8VaapeVDFA5szj8cn5E=; b=Lv8f839nF8+EVmiaMYOb/Xm4f/LehfGhAdomdV+3gWKS8Rs9pqFMFBpERQHT+ck6XJVdT4uwja7K0djMkAPbKy3QYfZsmXigwhraABKm4of5PUEhjSLh37qFl008VlgoJOIq2nJExOEUm9WAKFfTChfWTe1uM/aKLXyzLhn8IWs= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1620877566711632.8078542002369; Wed, 12 May 2021 20:46:06 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-518-911FFkijOci43BVe1KhG3g-1; Wed, 12 May 2021 23:46:03 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7C2E18015F3; Thu, 13 May 2021 03:45:56 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 399095D9D7; Thu, 13 May 2021 03:45:54 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 739D91800BB0; Thu, 13 May 2021 03:45:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 14D3jmYG015920 for ; Wed, 12 May 2021 23:45:48 -0400 Received: by smtp.corp.redhat.com (Postfix) id 40C8D10553FC; Thu, 13 May 2021 03:45:48 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 399A410CD2DB for ; Thu, 13 May 2021 03:45:44 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BBB6B85828E for ; Thu, 13 May 2021 03:45:44 +0000 (UTC) Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-494-QHPaw-JUMXmvIwt9jCDMJg-1; Wed, 12 May 2021 23:45:42 -0400 Received: by mail-pf1-f178.google.com with SMTP id a5so13420196pfa.11 for ; Wed, 12 May 2021 20:45:42 -0700 (PDT) Received: from C02D383UML85.bytedance.net ([139.177.225.235]) by smtp.gmail.com with ESMTPSA id k14sm1021494pgl.2.2021.05.12.20.45.37 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 May 2021 20:45:39 -0700 (PDT) X-MC-Unique: 911FFkijOci43BVe1KhG3g-1 X-MC-Unique: QHPaw-JUMXmvIwt9jCDMJg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=NJpxulCklelCzE7pDfP9TrTS8VaapeVDFA5szj8cn5E=; b=O8ksYUmmoSYYCuENNPMU1nHJvwEboAlrfJpfJ3tKjsg8uDfLYn2WBm7wXNx84FJCMI iBKUkj2kySpq2w2b3nc0oauVVbKd/pYNcAJ3GL8bdrZQf6Zlq20cQuU9u9NPjjdWzRxy D82rhbB2XaBrb80kHDaHBKHsMNXEN/WpXddJ6zA45X2NlcXvhD8qRlK59JU4SG4IC+72 CFSIaESdfns64ztlLCpjc0nB8wGpntw18fq7QFH/lpR0WzVH/w00hznT7R953A+i3rAX kR51N2sbQjUwVuu7cwhRtAUr/hiy2oHrLWkfmwuocbUWzuYgB9O+6l6xTvpsq3g16wuU WJaQ== X-Gm-Message-State: AOAM533vMGcVVVia8ZIo7Q5ePKHub6YHCJgcUT6y/0CNnkhOU7/r/vh8 XanL5MuGqh0v3evnWjB59yNoYJL34umOj/nZ X-Google-Smtp-Source: ABdhPJwGYiF2Th3mMs3MM48ofJCRgZrNn7KAlCxmGHE1kQfql28ypkb8d1k5bx8ZbD2NJvKlQbLZIQ== X-Received: by 2002:a63:ce41:: with SMTP id r1mr39427461pgi.222.1620877540492; Wed, 12 May 2021 20:45:40 -0700 (PDT) From: Zhiyong Ye To: libvir-list@redhat.com Subject: [PATCH] qemu: implement NVMe device emulation support Date: Thu, 13 May 2021 11:45:25 +0800 Message-Id: <20210513034526.26948-1-yezhiyong@bytedance.com> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Zhiyong Ye , zhenwei pi X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implements QEMU support for NVMe device emulation, which was added in qemu 1.6.0: https://git.qemu.org/?p=3Dqemu.git;a=3Dcommit;h=3Df3c507adcd7 It can be used by adding elements in XML like this: ... QEMU-WMAP9A966149 ... Signed-off-by: Zhiyong Ye Signed-off-by: zhenwei pi --- docs/formatdomain.rst | 11 ++++++-- docs/schemas/domaincommon.rng | 3 ++- src/bhyve/bhyve_command.c | 1 + src/bhyve/bhyve_domain.c | 1 + src/conf/domain_conf.c | 5 ++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 4 ++- src/hyperv/hyperv_driver.c | 2 ++ src/qemu/qemu_alias.c | 1 + src/qemu/qemu_command.c | 8 ++++++ src/qemu/qemu_domain_address.c | 11 +++++--- src/qemu/qemu_hotplug.c | 2 ++ src/qemu/qemu_validate.c | 13 ++++++++++ src/util/virutil.c | 3 ++- src/vbox/vbox_common.c | 1 + src/vz/vz_sdk.c | 2 ++ src/vz/vz_utils.c | 1 + tests/qemuxml2argvdata/disk-nvme-device.args | 28 +++++++++++++++++++++ tests/qemuxml2argvdata/disk-nvme-device.xml | 30 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmloutdata/disk-nvme-device.xml | 36 +++++++++++++++++++++++= ++++ tests/qemuxml2xmltest.c | 1 + 22 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 tests/qemuxml2argvdata/disk-nvme-device.args create mode 100644 tests/qemuxml2argvdata/disk-nvme-device.xml create mode 100644 tests/qemuxml2xmloutdata/disk-nvme-device.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index fa5c14febc..d7e5299664 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2479,6 +2479,12 @@ paravirtualized driver is specified via the ``disk``= element. + + + + + QEMU-WMAP9A966149 + ... =20 @@ -2880,8 +2886,9 @@ 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 - omitted, the bus type is inferred from the style of the device name (e.= g. a + "virtio", "xen", "usb", "sata", "sd" :since:`"sd" since 1.1.2`, + or "nvme" :since:`"nvme" since 7.3.0 (QEMU only)`. 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 op= tional attribute ``tray`` indicates the tray status of the removable disks (i.= e. CDROM or Floppy disk), the value can be either "open" or "closed", defa= ults diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index a2e5c50c1d..47c60d7247 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2202,7 +2202,7 @@ =20 - (ioemu:)?(fd|hd|sd|vd|xvd|ubd)[a-zA-Z0-9_]+<= /param> + (ioemu:)?(fd|hd|sd|vd|xvd|ubd|nvme)[a-zA-Z0-= 9_]+ @@ -2222,6 +2222,7 @@ uml sata sd + nvme diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index f8e0ce5123..d601f15eae 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -320,6 +320,7 @@ bhyveBuildDiskArgStr(const virDomainDef *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: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 33e74e2e25..3972b57ba9 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -142,6 +142,7 @@ bhyveDomainDiskDefAssignAddress(struct _bhyveConn *driv= er, 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: break; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7044701fac..1c89309f29 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -350,6 +350,7 @@ VIR_ENUM_IMPL(virDomainDiskBus, "uml", "sata", "sd", + "nvme", ); =20 VIR_ENUM_IMPL(virDomainDiskCache, @@ -5356,6 +5357,8 @@ virDomainDiskDefPostParse(virDomainDiskDef *disk, disk->bus =3D VIR_DOMAIN_DISK_BUS_XEN; else if (STRPREFIX(disk->dst, "ubd")) disk->bus =3D VIR_DOMAIN_DISK_BUS_UML; + else if (STRPREFIX(disk->dst, "nvme")) + disk->bus =3D VIR_DOMAIN_DISK_BUS_NVME; } } =20 @@ -7723,6 +7726,7 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xml= opt, 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 */ @@ -28737,6 +28741,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 =3D 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 2d5462bb55..b54284ee49 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -381,6 +381,7 @@ typedef enum { VIR_DOMAIN_DISK_BUS_UML, VIR_DOMAIN_DISK_BUS_SATA, VIR_DOMAIN_DISK_BUS_SD, + VIR_DOMAIN_DISK_BUS_NVME, =20 VIR_DOMAIN_DISK_BUS_LAST } virDomainDiskBus; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 686b9e8d16..0e79698381 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -227,6 +227,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskB= us bus, 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: return true; @@ -721,7 +722,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: %s"), disk->dst); return -1; diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index ff20d5548b..f6fb0a610b 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -970,6 +970,7 @@ hypervDomainAttachStorage(virDomainPtr domain, virDomai= nDef *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 co= ntroller type")); @@ -3125,6 +3126,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, co= nst 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 b= us in definition")); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index ed47fa335a..b4fd8f9ae6 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -254,6 +254,7 @@ qemuAssignDeviceDiskAlias(virDomainDef *def, case VIR_DOMAIN_DISK_BUS_XEN: 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: break; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d6c5308ef0..14d6bfcd89 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1607,6 +1607,7 @@ qemuCheckIOThreads(const virDomainDef *def, 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_CONFIG_UNSUPPORTED, @@ -1847,6 +1848,13 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, virBufferAsprintf(&opt, "floppy,unit=3D%d", disk->info.addr.drive.= unit); break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: + virBufferAddLit(&opt, "nvme"); + + if (qemuBuildDeviceAddressStr(&opt, def, &disk->info) < 0) + return NULL; + 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 a11e40d9b2..7249328b80 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -778,7 +778,6 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, case VIR_DOMAIN_DEVICE_DISK: switch ((virDomainDiskBus) dev->data.disk->bus) { case VIR_DOMAIN_DISK_BUS_VIRTIO: - /* only virtio disks use PCI */ switch ((virDomainDiskModel) dev->data.disk->model) { case VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL: /* Transitional devices only work in conventional PCI slot= s */ @@ -792,6 +791,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, } return 0; =20 + 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: @@ -2235,10 +2237,11 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, } } =20 - /* Disks (VirtIO only for now) */ + /* Disks (VirtIO and NVMe-device only for now) */ for (i =3D 0; i < def->ndisks; i++) { - /* Only VirtIO disks use PCI addrs */ - if (def->disks[i]->bus !=3D VIR_DOMAIN_DISK_BUS_VIRTIO) + /* Only VirtIO adn NVMe-device disks use PCI addrs */ + if (def->disks[i]->bus !=3D VIR_DOMAIN_DISK_BUS_VIRTIO && + def->disks[i]->bus !=3D VIR_DOMAIN_DISK_BUS_NVME) continue; =20 /* don't touch s390 devices */ diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index a64cddb9e7..862f30572d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1092,6 +1092,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: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -5312,6 +5313,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: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("This type of disk cannot be hot unplugged")); return -1; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 141203f979..73ce7cc617 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2721,6 +2721,19 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDom= ainDiskDef *disk, =20 break; =20 + case VIR_DOMAIN_DISK_BUS_NVME: + if (disk->info.type !=3D 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 d= isk")); + return -1; + } + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_NONE: diff --git a/src/util/virutil.c b/src/util/virutil.c index 3f49a469e5..a586b94c9a 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -369,7 +369,8 @@ int virDiskNameParse(const char *name, int *disk, int *= partition) const char *ptr =3D NULL; char *rem; int idx =3D 0; - static char const* const drive_prefix[] =3D {"fd", "hd", "vd", "sd", "= xvd", "ubd"}; + static char const* const drive_prefix[] =3D {"fd", "hd", "vd", "sd", + "xvd", "ubd", "nvme"}; size_t i; size_t n_digits; =20 diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 1ca521321c..11f057236c 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -1154,6 +1154,7 @@ vboxAttachDrives(virDomainDef *def, struct _vboxDrive= r *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: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index e09950812d..0a804aa284 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3469,6 +3469,7 @@ static int prlsdkConfigureDisk(struct _vzDriver *driv= er, 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: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -4354,6 +4355,7 @@ prlsdkGetBlockStats(PRL_HANDLE sdkstats, 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: virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index 8fed875281..f7e4d174cf 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -244,6 +244,7 @@ vzCheckDiskAddressDriveUnsupportedParams(virDomainDiskD= ef *disk) 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: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", diff --git a/tests/qemuxml2argvdata/disk-nvme-device.args b/tests/qemuxml2a= rgvdata/disk-nvme-device.args new file mode 100644 index 0000000000..594e1dea31 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-nvme-device.args @@ -0,0 +1,28 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/tmp/lib/domain--1-QEMUGuest1 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ +QEMU_AUDIO_DRV=3Dnone \ +/usr/bin/qemu-system-i386 \ +-name QEMUGuest1 \ +-S \ +-machine pc,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff \ +-m 214 \ +-realtime mlock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-QEMUGuest1/moni= tor.sock,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-no-acpi \ +-usb \ +-drive file=3D/tmp/data.img,format=3Draw,if=3Dnone,id=3Ddrive-nvme-disk0 \ +-device nvme,bus=3Dpci.0,addr=3D0x2,drive=3Ddrive-nvme-disk0,id=3Dnvme-dis= k0,bootindex=3D1,serial=3DQEMU-WMAP9A966149 diff --git a/tests/qemuxml2argvdata/disk-nvme-device.xml b/tests/qemuxml2ar= gvdata/disk-nvme-device.xml new file mode 100644 index 0000000000..18d9632f20 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-nvme-device.xml @@ -0,0 +1,30 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + + + + + QEMU-WMAP9A966149 + + + + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index a9dafe226e..681158c73b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1493,6 +1493,7 @@ mymain(void) DO_TEST_CAPS_ARCH_VER("disk-arm-virtio-sd", "aarch64", "4.0.0"); DO_TEST_CAPS_ARCH_LATEST("disk-arm-virtio-sd", "aarch64"); =20 + DO_TEST("disk-nvme-device", NONE); DO_TEST("graphics-egl-headless", QEMU_CAPS_DEVICE_CIRRUS_VGA); DO_TEST_CAPS_LATEST("graphics-egl-headless"); diff --git a/tests/qemuxml2xmloutdata/disk-nvme-device.xml b/tests/qemuxml2= xmloutdata/disk-nvme-device.xml new file mode 100644 index 0000000000..e016164d28 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-nvme-device.xml @@ -0,0 +1,36 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + + + + + QEMU-WMAP9A966149 +
+ + +
+ + +
+ + + + +