From nobody Tue Dec 23 08:49:08 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=smartx.com ARC-Seal: i=1; a=rsa-sha256; t=1745754619; cv=none; d=zohomail.com; s=zohoarc; b=UgiXei//3ZCwGB0MUigq4vzpXhcG7ioLHKHxgfmjy1eUrRfaeCrvFy5v1qbm0jyya+tYcwY4iEnGYwusEDF1W3Rcrf2cS/joZToV9Kh05hJQxAB4rusU6RGmcT1xsNVcSdblAgcNodgK+pDl0MFp4eN9E3J+vsyOMiam6KuIIMI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745754619; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=tyDtiVcYYY/DE0pB/zbZ16xt/YKrRNWF+UEi3r4s+Gs=; b=d/Ye3tiI6ny9k+OEwAbDIlAaUgNzPs2Ix7t3mkqQqPQs5MRUZmoCr7cj7gofeclMYuTSqeiNZjq7fjLB5tib/DQUumYh8JX2mdj7TUKYDPGJgXjfTuFO74SyVWaSkhctJAB51IjKuUYO4AZuFL+B5y14R8S86UL3mntdCr9Jq/k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 174575461921877.49518424784071; Sun, 27 Apr 2025 04:50:19 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 2B757B3B; Sun, 27 Apr 2025 07:50:18 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id ECB00B6B; Sun, 27 Apr 2025 07:48:43 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DB9F5989; Sun, 27 Apr 2025 07:48:39 -0400 (EDT) Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8231BA10 for ; Sun, 27 Apr 2025 07:48:38 -0400 (EDT) Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-22da3b26532so34514245ad.0 for ; Sun, 27 Apr 2025 04:48:38 -0700 (PDT) Received: from honglei-dev.smartx.com ([45.8.186.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22db4d77ab1sm62832315ad.23.2025.04.27.04.48.34 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 27 Apr 2025 04:48:35 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20230601.gappssmtp.com; s=20230601; t=1745754516; x=1746359316; darn=lists.libvirt.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=tyDtiVcYYY/DE0pB/zbZ16xt/YKrRNWF+UEi3r4s+Gs=; b=Q08VIvYf6wDc8cXRO6h6ha4Vv32seK334ysdJoB05Q2joanOYjoQYFRDEWEU+lpEfv 5tWGOFlbiDLH8L8avXQ8V2DC6lHMynSYUes3HjRSlIjTCZ4D55vrMEzkzIX8qbBeDzvj zzxxK8zCAeTVMbFT63JuJKvShj1ShQ9nnUFkw8F/DNlw0Wy/SmjOnjXLDsiuHKoSISQB WnkVYZS/u9B3PybU04zBv577SKGVyK30qfhYICliUAsiBq6WtUZCEb5jYt+dmfgrUoys tJk+8Ptpw4/VcU5vJyD2fWoWIqT5007iS0UCB9brdkAY9AOwJh3XViaft00ySIYCLcBC caYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745754516; x=1746359316; h=references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tyDtiVcYYY/DE0pB/zbZ16xt/YKrRNWF+UEi3r4s+Gs=; b=R5obhuxQoPtpuSyxH439anx5DaNMH1OhRYCUVIy5gu1sKCpfNWPSaYE5vYM/gWmC74 SCJyc/XzHV+twNAhCp8WxcvmYPZFdEBo9SdrNury1S3b7xf0HFUsLoFqp5INaU0x0WYZ vYfNtkhtIIAqze9Fn9ZD368jAG50dIhoxXSmucEKz9R26JPa/ucwgIqZ7cep0TGfa63p rtSFZRAeMK8VwC7+V8G1qk9aJYniVGfqqVwMvp01HHHuC3chiK3nRza3ngKy1zHmId2H a9X85HiQWvaQXNK0Du6jkMhCTtlcQTJ150k5j9vRZNh01vlK3i01OV2V5xGHd7gDk8GB DoWw== X-Gm-Message-State: AOJu0Yxm12giu7at8I6QmUOMHeJGnL+w4/U8DpN6E3gl6fPQMSEeU/Gk qy7sOim1BalJKvMnmVpXIKeTjUJbNvswS1jXlCnU58TV5KC7/qyru+iB+opAmCiuhZor14JHlnU TSP2gMLWt X-Gm-Gg: ASbGncvR1ZS/kq3oBAYjXz9yNZPKzxIxyi77iZ2vzu4TfeiTbPRprNQOv6HFvmIl7Rs 40bN5a0tLsWn6S6tZAYPXcivjaNbgmmONpZHBMbygrEnjmz8sdCfkotRbn6gJo7aoLwHCjGxgd0 To3JGroEYVQuBrkAX/4h1Iq6yzgD4X2Tj+1IaSKdNTKcBZ3UICEvZHrfdTg8fsmlNBREpwUFmcl c3/ZPFYAU3gwPk/JwENWx++YWOKr1mbb9Qfgzas17DwwGOknqGc8T/0Px5qW1i3jyyJ1/T0sgFX xMVZoDsAbTeWYiK5VLaOAvPTp4853+9BzDJiW+tjkYauFaSoLNG2PqInnlQ= X-Google-Smtp-Source: AGHT+IF54cbU9S/fK1K90mlUBA2D0axe9CYzckBByiOBt3TzqtVPznYtulYiH+Q690RfA/QJW5acMg== X-Received: by 2002:a17:902:f605:b0:224:584:6f07 with SMTP id d9443c01a7336-22dbf62c3d3mr110675755ad.37.1745754515894; Sun, 27 Apr 2025 04:48:35 -0700 (PDT) From: honglei.wang@smartx.com To: devel@lists.libvirt.org Subject: [PATCHv2 1/5] qemu: Add support for NVMe namespace disk bus type Date: Sun, 27 Apr 2025 19:48:03 +0800 Message-Id: <20250427114807.4214-2-honglei.wang@smartx.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20250427114807.4214-1-honglei.wang@smartx.com> References: <20250427114807.4214-1-honglei.wang@smartx.com> Message-ID-Hash: 7EEEMV7IFN7T4QXUOVFQMXU6EC7P5KJ5 X-Message-ID-Hash: 7EEEMV7IFN7T4QXUOVFQMXU6EC7P5KJ5 X-MailFrom: honglei.wang@smartx.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: ray X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @smartx-com.20230601.gappssmtp.com) X-ZM-MESSAGEID: 1745754621400019100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: ray This patch extends the disk bus support by introducing a new nvme-ns bus ty= pe. The nvme-ns bus disk needs to be attached to nvme controller. A controller can contain multiple nvme-ns disk devices. Signed-off-by: ray --- src/conf/domain_conf.c | 39 +++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++++ src/conf/domain_postparse.c | 2 ++ src/conf/domain_validate.c | 4 +++- 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 | 14 ++++++++++++-- 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, 118 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 542d6ade91..e4b3bf8720 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-ns", ); =20 VIR_ENUM_IMPL(virDomainDiskCache, @@ -420,6 +421,7 @@ VIR_ENUM_IMPL(virDomainController, "pci", "xenbus", "isa", + "nvme", ); =20 VIR_ENUM_IMPL(virDomainControllerModelPCI, @@ -2563,6 +2565,7 @@ virDomainControllerDefNew(virDomainControllerType typ= e) 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; } @@ -6869,6 +6872,14 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xm= lopt G_GNUC_UNUSED, def->info.addr.drive.unit =3D idx % 2; break; =20 + case VIR_DOMAIN_DISK_BUS_NVME_NS: + /* For NVME-NS, each nvme controller has a maximum of 256 nvme-ns = */ + def->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; + def->info.addr.drive.controller =3D idx / 256; + def->info.addr.drive.bus =3D 0; + def->info.addr.drive.unit =3D idx % 256; + break; + case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: @@ -8784,6 +8795,7 @@ virDomainControllerModelTypeFromString(const virDomai= nControllerDef *def, case VIR_DOMAIN_CONTROLLER_TYPE_SATA: case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: case VIR_DOMAIN_CONTROLLER_TYPE_LAST: return -1; } @@ -8812,6 +8824,7 @@ virDomainControllerModelTypeToString(virDomainControl= lerDef *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; } @@ -8832,6 +8845,8 @@ virDomainControllerDefParseXML(virDomainXMLOption *xm= lopt, int ntargetNodes =3D 0; g_autofree xmlNodePtr *modelNodes =3D NULL; int nmodelNodes =3D 0; + g_autofree xmlNodePtr *serialNodes =3D NULL; + int nserialNodes =3D 0; int numaNode =3D -1; int ports; VIR_XPATH_NODE_AUTORESTORE(ctxt) @@ -8969,6 +8984,18 @@ virDomainControllerDefParseXML(virDomainXMLOption *x= mlopt, if (virXMLPropInt(node, "ports", 10, VIR_XML_PROP_NONNEGATIVE, &ports,= -1) < 0) return NULL; =20 + if ((nserialNodes =3D virXPathNodeSet("./serial", ctxt, &serialNodes))= > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Multiple elements in controller definit= ion not allowed")); + return NULL; + } + + if (nserialNodes =3D=3D 1) { + if (def->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_NVME) { + def->opts.nvmeopts.serial =3D virXMLNodeContentString(serialNod= es[0]); + } + } + switch (def->type) { case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: { if (virXMLPropInt(node, "vectors", 10, VIR_XML_PROP_NONNEGATIVE, @@ -9054,6 +9081,7 @@ virDomainControllerDefParseXML(virDomainXMLOption *xm= lopt, 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; @@ -14998,6 +15026,10 @@ virDomainDiskControllerMatch(int controller_type, = int disk_bus) disk_bus =3D=3D VIR_DOMAIN_DISK_BUS_SATA) return true; =20 + if (controller_type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_NVME && + disk_bus =3D=3D VIR_DOMAIN_DISK_BUS_NVME_NS) + return true; + return false; } =20 @@ -24028,6 +24060,12 @@ virDomainControllerDefFormat(virBuffer *buf, } break; =20 + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: + if (def->opts.nvmeopts.serial !=3D NULL) { + virBufferAsprintf(&childBuf, "%s\n", def->opt= s.nvmeopts.serial); + } + break; + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: if (virDomainControllerDefFormatPCI(&childBuf, def, flags) < 0) return -1; @@ -29662,6 +29700,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_NS: 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 58b97a2b54..e9db1ea896 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_NS, =20 VIR_DOMAIN_DISK_BUS_LAST } virDomainDiskBus; @@ -611,6 +612,7 @@ typedef enum { VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_XENBUS, VIR_DOMAIN_CONTROLLER_TYPE_ISA, + VIR_DOMAIN_CONTROLLER_TYPE_NVME, =20 VIR_DOMAIN_CONTROLLER_TYPE_LAST } virDomainControllerType; @@ -766,6 +768,10 @@ struct _virDomainXenbusControllerOpts { int maxEventChannels; /* -1 =3D=3D undef */ }; =20 +struct _virDomainNVMeControllerOpts { + char *serial; +}; + /* Stores the virtual disk controller configuration */ struct _virDomainControllerDef { virDomainControllerType type; @@ -782,6 +788,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 bf33f29638..68d99f3c81 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -523,6 +523,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, "nvmens")) + disk->bus =3D VIR_DOMAIN_DISK_BUS_NVME_NS; } } =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index d0d4bc0bf4..1ad8350117 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -267,6 +267,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskB= us 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_NS: case VIR_DOMAIN_DISK_BUS_LAST: return true; } @@ -948,7 +949,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, "nvmens")) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid harddisk device name: %1$s"), disk->dst); return -1; diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index c70437bc05..8c6fcdbeaa 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -276,6 +276,8 @@ typedef struct _virDomainXMLPrivateDataCallbacks virDom= ainXMLPrivateDataCallback =20 typedef struct _virDomainXenbusControllerOpts virDomainXenbusControllerOpt= s; =20 +typedef struct _virDomainNVMeControllerOpts virDomainNVMeControllerOpts; + typedef enum { VIR_DOMAIN_DISK_IO_DEFAULT =3D 0, VIR_DOMAIN_DISK_IO_NATIVE, diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 0d1e388c08..aefb48923b 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -948,6 +948,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_NS: case VIR_DOMAIN_DISK_BUS_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported co= ntroller type")); @@ -3078,6 +3079,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_NS: 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 3e6bced4a8..5cffd9e5c8 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_NS: diskPriv->qomName =3D g_strdup(disk->info.alias); break; =20 diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e6d308534f..d5f75fb3f4 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -531,6 +531,17 @@ qemuBuildDeviceAddresDriveProps(virJSONValue *props, } =20 break; + case VIR_DOMAIN_DISK_BUS_NVME_NS: + if (!(controllerAlias =3D virDomainControllerAliasFind(domainDef, + VIR_DOMAIN= _CONTROLLER_TYPE_NVME, + info->addr= .drive.controller))) + return -1; + + if (virJSONValueObjectAdd(&props, + "s:bus", controllerAlias, + NULL) < 0) + return -1; + break; =20 case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_USB: @@ -1722,6 +1733,10 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, driver =3D "floppy"; break; =20 + case VIR_DOMAIN_DISK_BUS_NVME_NS: + driver =3D "nvme-ns"; + break; + case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: @@ -2851,6 +2866,16 @@ qemuBuildControllerDevProps(const virDomainDef *doma= inDef, =20 break; =20 + 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: @@ -3013,6 +3038,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, }; =20 for (i =3D 0; i < G_N_ELEMENTS(contOrder); i++) { diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e89cdee487..a4d0c0d0d5 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -616,6 +616,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, } break; =20 + 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: @@ -738,6 +741,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *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; @@ -1919,6 +1923,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 5326aba281..844cfc2e02 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -848,7 +848,8 @@ qemuDomainAttachControllerDevice(virDomainObj *vm, bool releaseaddr =3D false; =20 if (controller->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && \ - controller->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) { + controller->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL && \ + controller->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_NVME) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("'%1$s' controller cannot be hot plugged."), virDomainControllerTypeToString(controller->type)); @@ -1058,6 +1059,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, @@ -5782,6 +5784,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; @@ -5856,6 +5859,11 @@ qemuDomainDiskControllerIsBusy(virDomainObj *vm, continue; break; =20 + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: + if (disk->bus !=3D VIR_DOMAIN_DISK_BUS_NVME_NS) + continue; + break; + case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: /* xenbus is not supported by the qemu driver */ continue; @@ -5905,6 +5913,7 @@ qemuDomainControllerIsBusy(virDomainObj *vm, case VIR_DOMAIN_CONTROLLER_TYPE_FDC: case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: case VIR_DOMAIN_CONTROLLER_TYPE_SATA: + case VIR_DOMAIN_CONTROLLER_TYPE_NVME: return qemuDomainDiskControllerIsBusy(vm, detach); =20 case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: @@ -5934,7 +5943,8 @@ qemuDomainDetachPrepController(virDomainObj *vm, int idx; virDomainControllerDef *controller =3D NULL; =20 - if (match->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI) { + if (match->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI && + match->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_NVME) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("'%1$s' controller cannot be hot unplugged."), virDomainControllerTypeToString(match->type)); diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index ed4af9ca8e..8150dffac6 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 b2c3c9e2f6..9985b2e2c1 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -2945,6 +2945,7 @@ qemuValidateDomainDeviceDefDiskIOThreads(const virDom= ainDef *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_NS: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOThreads not available for bus %1$s target %2$s= "), @@ -3079,6 +3080,7 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDoma= inDiskDef *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_NS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("disk device=3D'lun' is not supported for bus= =3D'%1$s'"), virDomainDiskBusTypeToString(disk->bus)); @@ -3194,6 +3196,14 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDom= ainDiskDef *disk, =20 break; =20 + case VIR_DOMAIN_DISK_BUS_NVME_NS: + if (disk->info.type !=3D 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: @@ -3382,6 +3392,7 @@ qemuValidateDomainDeviceDefDiskTransient(const virDom= ainDiskDef *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_NS: break; =20 case VIR_DOMAIN_DISK_BUS_IDE: @@ -4399,6 +4410,7 @@ qemuValidateDomainDeviceDefController(const virDomain= ControllerDef *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 6f18b2b2c8..95ab1cac8f 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_NS: case VIR_DOMAIN_DISK_BUS_NONE: case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, @@ -10792,6 +10793,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 2abcb282fe..02494f1061 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 =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", "nvmens"}; size_t i; size_t n_digits; =20 diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 349ac832dc..703150d3c6 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -494,6 +494,7 @@ vboxSetStorageController(virDomainControllerDef *contro= ller, 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 controlle= r type"), @@ -1238,6 +1239,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_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 0dd03c1a88..31878c7399 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2245,6 +2245,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_NS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported bus type '%1$s' for device type '%2$= s'"), virDomainDiskBusTypeToString(def->bus), --=20 2.11.0