From nobody Sun Nov 16 18:53:18 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1606434906; cv=none; d=zohomail.com; s=zohoarc; b=R3LUu1WesJj7xk1GViAeKACsLM3cpA+NmJ8oNQuZDCWYSQ0o2nii9WLYhrHIrh36aEjWVmxOQV7TPwax0WHw4FJwCZYjJRRqGniSGMkPA9U2eBK5QeEauSVEx3oHK7w42nxWcZrM9GssisZ5KHJavRd4ha57t+3cbPQCMVYs7rE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1606434906; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qnUU2lOqvT7/v/Hed/S2MvdLIpUGXX97YuIOZRmdD0o=; b=eX2cN5mx/5ZVVLzuELZfo6T89Evh/WMU3OlcSh1MxgYBfVPlxAnU1ykDZgqGuace2wwESuo+z0ojevIlU6pKEO6Z34NWQwWcbgVuMZ2i72IoO56vdoCIv4+1ol0OruC+YTMkfWLBpbmCq3ncVm2VRjKu/+j4MZdFdYEpjfEkMsU= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1606434905881324.2655259115354; Thu, 26 Nov 2020 15:55:05 -0800 (PST) Received: from localhost ([::1]:57816 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kiR6O-0004vP-9V for importer@patchew.org; Thu, 26 Nov 2020 18:55:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55902) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kiQxy-0007Qr-B5; Thu, 26 Nov 2020 18:46:22 -0500 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:53671) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kiQxs-0003ug-Gt; Thu, 26 Nov 2020 18:46:22 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 4C7505C01FC; Thu, 26 Nov 2020 18:46:15 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Thu, 26 Nov 2020 18:46:15 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id E4BE73064AB2; Thu, 26 Nov 2020 18:46:13 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=qnUU2lOqvT7/v /Hed/S2MvdLIpUGXX97YuIOZRmdD0o=; b=b2bS9y1iNQiumKXAyQmzrSYA+tIsi tKYsAl0g8rxIwvhclfn2LAj0cVa7BOt5S84cMJ/lLwMkptXupJWv6QzWKcOUUDAe 5yRLnzt9nlGYOE+t84+EQXyIvMAwo7Yw5bVHn9/Q07PFO89K6/tRmih9nYLf4gGh 7RvtumsvlNbwcKu00J0Po3+6HwWqEW0VaaSYG9mkfbZJ8CzgQuqvVhtDX4PU3FQl R2C6p5IKRTRSuOluLdfAKpF/oVXElGmUidpyB3Q0xR+D/1dfu6D3hiatpb+mWP2t N8cF3FrWNFXm4E5DFtoZ6WB2aJKOZGkkUgWKGkSHMHygCKqF6pZP75AIA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=qnUU2lOqvT7/v/Hed/S2MvdLIpUGXX97YuIOZRmdD0o=; b=M1DzdnHc KgcjxLxD4V+8M8K8CtIw45RWb180nMrIOKMTTkkIqNipnLqHj1WZnzUWUeSn/UQV Ly2+LJHok1ys//YMyk82CnlQq03QA3LL0sgh6sgA+0LsivqHOALoQXliJw+sJOrB 8/pjk2M7Ra6PZ77cPf+S8tnS1QF0X/YYxVEGokYry9GxXN+kwLfS618/iBvta76b gnSoI8tkuZ9mlr78dpzjj9uK7feOZRCEYbs4xFHsnuQVTPq/vEj0+K7a2amKcVfT 6MYZQNhfp6k8GNW+vGm0yqqRqdzU9/e4NWEyL1PbO4JRFGx/A1uFnsN96tBeMiBd MkIc6B4wP9Vr9A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrudehfedgudefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtne curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 07/12] hw/block/nvme: add the zone management receive command Date: Fri, 27 Nov 2020 00:45:56 +0100 Message-Id: <20201126234601.689714-8-its@irrelevant.dk> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201126234601.689714-1-its@irrelevant.dk> References: <20201126234601.689714-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=66.111.4.27; envelope-from=its@irrelevant.dk; helo=out3-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Keith Busch , Stefan Hajnoczi , Klaus Jensen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add the Zone Management Receive command. Signed-off-by: Klaus Jensen --- hw/block/nvme-ns.h | 8 +++ hw/block/nvme.h | 1 + include/block/nvme.h | 46 +++++++++++++ hw/block/nvme-ns.c | 8 +++ hw/block/nvme.c | 150 ++++++++++++++++++++++++++++++++++++++++++ hw/block/trace-events | 1 + 6 files changed, 214 insertions(+) diff --git a/hw/block/nvme-ns.h b/hw/block/nvme-ns.h index e373d62c5873..6370ef1a162b 100644 --- a/hw/block/nvme-ns.h +++ b/hw/block/nvme-ns.h @@ -31,11 +31,13 @@ typedef struct NvmeNamespaceParams { struct { uint64_t zcap; uint64_t zsze; + uint8_t zdes; } zns; } NvmeNamespaceParams; =20 typedef struct NvmeZone { NvmeZoneDescriptor *zd; + uint8_t *zde; =20 uint64_t wp_staging; } NvmeZone; @@ -59,6 +61,7 @@ typedef struct NvmeNamespace { =20 NvmeZone *zones; NvmeZoneDescriptor *zd; + uint8_t *zde; } zns; } NvmeNamespace; =20 @@ -99,6 +102,11 @@ static inline uint64_t nvme_ns_zsze(NvmeNamespace *ns) return nvme_ns_lbafe(ns)->zsze; } =20 +static inline size_t nvme_ns_zdes_bytes(NvmeNamespace *ns) +{ + return ns->params.zns.zdes << 6; +} + /* calculate the number of LBAs that the namespace can accomodate */ static inline uint64_t nvme_ns_nlbas(NvmeNamespace *ns) { diff --git a/hw/block/nvme.h b/hw/block/nvme.h index b1616ba79733..97f9f543c9dd 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -63,6 +63,7 @@ static inline const char *nvme_io_opc_str(uint8_t opc) case NVME_CMD_WRITE_ZEROES: return "NVME_NVM_CMD_WRITE_ZEROES"; case NVME_CMD_DSM: return "NVME_NVM_CMD_DSM"; case NVME_CMD_COPY: return "NVME_NVM_CMD_COPY"; + case NVME_CMD_ZONE_MGMT_RECV: return "NVME_ZONED_CMD_ZONE_MGMT_RECV"; default: return "NVME_NVM_CMD_UNKNOWN"; } } diff --git a/include/block/nvme.h b/include/block/nvme.h index 6a5616bb9304..e000e79bb12b 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -485,6 +485,7 @@ enum NvmeIoCommands { NVME_CMD_WRITE_ZEROES =3D 0x08, NVME_CMD_DSM =3D 0x09, NVME_CMD_COPY =3D 0x19, + NVME_CMD_ZONE_MGMT_RECV =3D 0x7a, }; =20 typedef struct QEMU_PACKED NvmeDeleteQ { @@ -597,6 +598,44 @@ enum { NVME_RW_PRINFO_PRCHK_REF =3D 1 << 10, }; =20 +typedef struct QEMU_PACKED NvmeZoneMgmtRecvCmd { + uint8_t opcode; + uint8_t flags; + uint16_t cid; + uint32_t nsid; + uint8_t rsvd8[16]; + NvmeCmdDptr dptr; + uint64_t slba; + uint32_t numdw; + uint8_t zra; + uint8_t zrasf; + uint8_t pr; + uint8_t rsvd55[9]; +} NvmeZoneMgmtRecvCmd; + +enum { + NVME_ZMR_REPORT =3D 0x0, + NVME_ZMR_EXTENDED_REPORT =3D 0x1, + + NVME_ZMR_PARTIAL =3D 0x1, +}; + +enum { + NVME_ZMR_LIST_ALL =3D 0x0, + NVME_ZMR_LIST_ZSE =3D 0x1, + NVME_ZMR_LIST_ZSIO =3D 0x2, + NVME_ZMR_LIST_ZSEO =3D 0x3, + NVME_ZMR_LIST_ZSC =3D 0x4, + NVME_ZMR_LIST_ZSF =3D 0x5, + NVME_ZMR_LIST_ZSRO =3D 0x6, + NVME_ZMR_LIST_ZSO =3D 0x7, +}; + +typedef struct QEMU_PACKED NvmeZoneReportHeader { + uint64_t num_zones; + uint8_t rsvd[56]; +} NvmeZoneReportHeader; + typedef struct QEMU_PACKED NvmeDsmCmd { uint8_t opcode; uint8_t flags; @@ -846,6 +885,12 @@ typedef struct QEMU_PACKED NvmeZoneDescriptor { uint8_t rsvd32[32]; } NvmeZoneDescriptor; =20 +#define NVME_ZA_ZDEV (1 << 7) + +#define NVME_ZA_SET(za, attrs) ((za) |=3D (attrs)) +#define NVME_ZA_CLEAR(za, attrs) ((za) &=3D ~(attrs)) +#define NVME_ZA_CLEAR_ALL(za) ((za) =3D 0x0) + enum NvmeSmartWarn { NVME_SMART_SPARE =3D 1 << 0, NVME_SMART_TEMPERATURE =3D 1 << 1, @@ -1212,6 +1257,7 @@ static inline void _nvme_check_size(void) QEMU_BUILD_BUG_ON(sizeof(NvmeRwCmd) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeDsmCmd) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeCopyCmd) !=3D 64); + QEMU_BUILD_BUG_ON(sizeof(NvmeZoneMgmtRecvCmd) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeRangeType) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeErrorLog) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeFwSlotInfoLog) !=3D 512); diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index 1f3d0644ba42..f2e8ee80b606 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -61,6 +61,9 @@ static void nvme_ns_zns_init_zones(NvmeNamespace *ns) =20 zone =3D &ns->zns.zones[i]; zone->zd =3D &ns->zns.zd[i]; + if (ns->params.zns.zdes) { + zone->zde =3D &ns->zns.zde[i]; + } zone->wp_staging =3D zslba; =20 zd =3D zone->zd; @@ -81,11 +84,15 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) id_ns_zns->lbafe[i].zsze =3D ns->params.zns.zsze ? cpu_to_le64(ns->params.zns.zsze) : cpu_to_le64(pow2ceil(ns->params.zns.zcap)); + id_ns_zns->lbafe[i].zdes =3D ns->params.zns.zdes; } =20 ns->zns.num_zones =3D nvme_ns_nlbas(ns) / nvme_ns_zsze(ns); ns->zns.zones =3D g_malloc0_n(ns->zns.num_zones, sizeof(NvmeZone)); ns->zns.zd =3D g_malloc0_n(ns->zns.num_zones, sizeof(NvmeZoneDescripto= r)); + if (ns->params.zns.zdes) { + ns->zns.zde =3D g_malloc0_n(ns->zns.num_zones, nvme_ns_zdes_bytes(= ns)); + } =20 id_ns_zns->mar =3D 0xffffffff; id_ns_zns->mor =3D 0xffffffff; @@ -259,6 +266,7 @@ static Property nvme_ns_props[] =3D { DEFINE_PROP_UINT8("msrc", NvmeNamespace, params.msrc, 255), DEFINE_PROP_UINT64("zns.zcap", NvmeNamespace, params.zns.zcap, 0), DEFINE_PROP_UINT64("zns.zsze", NvmeNamespace, params.zns.zsze, 0), + DEFINE_PROP_UINT8("zns.zdes", NvmeNamespace, params.zns.zdes, 0), DEFINE_PROP_END_OF_LIST(), }; =20 diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 60a467d5df62..8dc6b565a4a0 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1012,6 +1012,7 @@ static uint16_t nvme_zrm_transition(NvmeNamespace *ns= , NvmeZone *zone, NvmeZoneState to) { NvmeZoneState from =3D nvme_zs(zone); + NvmeZoneDescriptor *zd =3D zone->zd; =20 trace_pci_nvme_zrm_transition(ns->params.nsid, nvme_zslba(zone), nvme_zs_to_str(from), from, @@ -1030,6 +1031,10 @@ static uint16_t nvme_zrm_transition(NvmeNamespace *n= s, NvmeZone *zone, switch (to) { case NVME_ZS_ZSE: case NVME_ZS_ZSO: + NVME_ZA_CLEAR_ALL(zd->za); + + /* fallthrough */ + case NVME_ZS_ZSEO: case NVME_ZS_ZSF: case NVME_ZS_ZSRO: @@ -1046,6 +1051,10 @@ static uint16_t nvme_zrm_transition(NvmeNamespace *n= s, NvmeZone *zone, switch (to) { case NVME_ZS_ZSE: case NVME_ZS_ZSO: + NVME_ZA_CLEAR_ALL(zd->za); + + /* fallthrough */ + case NVME_ZS_ZSF: case NVME_ZS_ZSRO: case NVME_ZS_ZSIO: @@ -1061,6 +1070,7 @@ static uint16_t nvme_zrm_transition(NvmeNamespace *ns= , NvmeZone *zone, case NVME_ZS_ZSRO: switch (to) { case NVME_ZS_ZSO: + NVME_ZA_CLEAR_ALL(zd->za); break; =20 default: @@ -1073,6 +1083,10 @@ static uint16_t nvme_zrm_transition(NvmeNamespace *n= s, NvmeZone *zone, switch (to) { case NVME_ZS_ZSE: case NVME_ZS_ZSO: + NVME_ZA_CLEAR_ALL(zd->za); + + /* fallthrough */ + case NVME_ZS_ZSRO: break; =20 @@ -1446,6 +1460,123 @@ out: nvme_enqueue_req_completion(nvme_cq(req), req); } =20 +static uint16_t nvme_zone_mgmt_recv(NvmeCtrl *n, NvmeRequest *req) +{ + NvmeZoneMgmtRecvCmd *recv =3D (NvmeZoneMgmtRecvCmd *)&req->cmd; + NvmeNamespace *ns =3D req->ns; + NvmeZone *zone; + uint8_t zra =3D recv->zra; + uint8_t zrasf =3D recv->zrasf; + uint8_t pr =3D recv->pr & 0x1; + uint64_t slba =3D le64_to_cpu(recv->slba); + size_t len =3D (le32_to_cpu(recv->numdw) + 1) << 2; + int num_zones =3D 0, zidx =3D 0, zidx_begin, i; + uint16_t zes, status; + uint8_t *buf, *bufp, zs_list; + + if (!nvme_ns_zoned(ns)) { + return NVME_INVALID_OPCODE | NVME_DNR; + } + + trace_pci_nvme_zone_mgmt_recv(nvme_cid(req), nvme_nsid(ns), slba, len, + zra, zrasf, pr); + + if (!(len && nvme_ns_zone(ns, slba))) { + return NVME_SUCCESS; + } + + status =3D nvme_check_mdts(n, len); + if (status) { + return status; + } + + switch (zrasf) { + case NVME_ZMR_LIST_ALL: + zs_list =3D 0; + break; + + case NVME_ZMR_LIST_ZSE: + zs_list =3D NVME_ZS_ZSE; + break; + + case NVME_ZMR_LIST_ZSIO: + zs_list =3D NVME_ZS_ZSIO; + break; + + case NVME_ZMR_LIST_ZSEO: + zs_list =3D NVME_ZS_ZSEO; + break; + + case NVME_ZMR_LIST_ZSC: + zs_list =3D NVME_ZS_ZSC; + break; + + case NVME_ZMR_LIST_ZSF: + zs_list =3D NVME_ZS_ZSF; + break; + + case NVME_ZMR_LIST_ZSRO: + zs_list =3D NVME_ZS_ZSRO; + break; + + case NVME_ZMR_LIST_ZSO: + zs_list =3D NVME_ZS_ZSO; + break; + default: + return NVME_INVALID_FIELD | NVME_DNR; + } + + zidx_begin =3D zidx =3D slba / nvme_ns_zsze(ns); + zes =3D sizeof(NvmeZoneDescriptor); + if (zra =3D=3D NVME_ZMR_EXTENDED_REPORT) { + zes +=3D nvme_ns_zdes_bytes(ns); + } + + buf =3D bufp =3D g_malloc0(len); + bufp +=3D sizeof(NvmeZoneReportHeader); + + while ((bufp + zes) - buf <=3D len && zidx < ns->zns.num_zones) { + zone =3D &ns->zns.zones[zidx++]; + + if (zs_list && zs_list !=3D nvme_zs(zone)) { + continue; + } + + num_zones++; + + memcpy(bufp, zone->zd, sizeof(NvmeZoneDescriptor)); + + if (zra =3D=3D NVME_ZMR_EXTENDED_REPORT) { + memcpy(bufp + sizeof(NvmeZoneDescriptor), zone->zde, + nvme_ns_zdes_bytes(ns)); + } + + bufp +=3D zes; + } + + if (!(pr & NVME_ZMR_PARTIAL)) { + if (!zs_list) { + num_zones =3D ns->zns.num_zones - zidx_begin; + } else { + num_zones =3D 0; + for (i =3D 0; i < ns->zns.num_zones; i++) { + zone =3D &ns->zns.zones[i]; + + if (zs_list =3D=3D nvme_zs(zone)) { + num_zones++; + } + } + } + } + + stq_le_p(buf, (uint64_t)num_zones); + + status =3D nvme_dma(n, buf, len, DMA_DIRECTION_FROM_DEVICE, req); + g_free(buf); + + return status; +} + static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *req) { NvmeNamespace *ns =3D req->ns; @@ -1907,6 +2038,8 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest = *req) return nvme_dsm(n, req); case NVME_CMD_COPY: return nvme_copy(n, req); + case NVME_CMD_ZONE_MGMT_RECV: + return nvme_zone_mgmt_recv(n, req); default: trace_pci_nvme_err_invalid_opc(req->cmd.opcode); return NVME_INVALID_OPCODE | NVME_DNR; @@ -2158,6 +2291,11 @@ static void nvme_effects_nvm(NvmeEffectsLog *effects) effects->iocs[NVME_CMD_COPY] =3D NVME_EFFECTS_CSUPP | NVME_EFFECTS_LBC= C; } =20 +static void nvme_effects_zoned(NvmeEffectsLog *effects) +{ + effects->iocs[NVME_CMD_ZONE_MGMT_RECV] =3D NVME_EFFECTS_CSUPP; +} + static uint16_t nvme_effects_log(NvmeCtrl *n, uint32_t buf_len, uint64_t o= ff, NvmeRequest *req) { @@ -2201,6 +2339,10 @@ static uint16_t nvme_effects_log(NvmeCtrl *n, uint32= _t buf_len, uint64_t off, =20 switch (csi) { case NVME_IOCS_ZONED: + nvme_effects_zoned(&effects); + + /* fallthrough */ + case NVME_IOCS_NVM: nvme_effects_nvm(&effects); break; @@ -3088,6 +3230,14 @@ static void nvme_ctrl_shutdown(NvmeCtrl *n) =20 /* fallthrough */ =20 + case NVME_ZS_ZSC: + if (nvme_wp(zone) =3D=3D nvme_zslba(zone) && + !(zone->zd->za & NVME_ZA_ZDEV)) { + nvme_zrm_transition(ns, zone, NVME_ZS_ZSE); + } + + /* fallthrough */ + default: break; } diff --git a/hw/block/trace-events b/hw/block/trace-events index 8b4533f99000..429b4849d2dc 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -54,6 +54,7 @@ pci_nvme_compare(uint16_t cid, uint32_t nsid, uint64_t sl= ba, uint32_t nlb) "cid pci_nvme_compare_cb(uint16_t cid) "cid %"PRIu16"" pci_nvme_aio_discard_cb(uint16_t cid) "cid %"PRIu16"" pci_nvme_aio_copy_in_cb(uint16_t cid) "cid %"PRIu16"" +pci_nvme_zone_mgmt_recv(uint16_t cid, uint32_t nsid, uint64_t slba, uint64= _t len, uint8_t zra, uint8_t zfeat, uint8_t zflags) "cid %"PRIu16" nsid %"P= RIu32" slba 0x%"PRIx64" len %"PRIu64" zra 0x%"PRIx8" zrasf 0x%"PRIx8" pr 0x= %"PRIx8"" pci_nvme_create_sq(uint64_t addr, uint16_t sqid, uint16_t cqid, uint16_t q= size, uint16_t qflags) "create submission queue, addr=3D0x%"PRIx64", sqid= =3D%"PRIu16", cqid=3D%"PRIu16", qsize=3D%"PRIu16", qflags=3D%"PRIu16"" pci_nvme_create_cq(uint64_t addr, uint16_t cqid, uint16_t vector, uint16_t= size, uint16_t qflags, int ien) "create completion queue, addr=3D0x%"PRIx6= 4", cqid=3D%"PRIu16", vector=3D%"PRIu16", qsize=3D%"PRIu16", qflags=3D%"PRI= u16", ien=3D%d" pci_nvme_del_sq(uint16_t qid) "deleting submission queue sqid=3D%"PRIu16"" --=20 2.29.2