From nobody Sun May 5 12:01:44 2024 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1643274367670944.9918405100661; Thu, 27 Jan 2022 01:06:07 -0800 (PST) Received: from localhost ([::1]:44518 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nD0jF-0008Pr-Ve for importer@patchew.org; Thu, 27 Jan 2022 04:06:06 -0500 Received: from eggs.gnu.org ([209.51.188.92]:55692) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00e-0004cu-Pm; Thu, 27 Jan 2022 03:20:00 -0500 Received: from new2-smtp.messagingengine.com ([66.111.4.224]:59115) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00c-0004Uc-RF; Thu, 27 Jan 2022 03:20:00 -0500 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailnew.nyi.internal (Postfix) with ESMTP id 0B1E058035E; Thu, 27 Jan 2022 03:19:57 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Thu, 27 Jan 2022 03:19:57 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 27 Jan 2022 03:19:54 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm2; bh=D5Ju29w9oGQpfi xiSPl0UH7PP/WSFw7k6ImRGBx4Pyw=; b=lFc2gHaoQ5yxaGKbzoYUyCyGoXBHBN 5vKUD4DnMYd38JsEHyTJAW/O94n2SUnPEJkQKqocQ1P43pMAssWR4ubz65a/qvkZ ieJS6cIF9swIIz7gNWV34s6hDRMWnSV/6VqFWpBd7QhpYlCM+ZIhiqaOuco/Ch/W cjMk0ebnYVw6WoAorcT73mM/Ih5f8eaLhJ/YKK1dGF17Ucl0pFTKqKlC12xnOKzm qy0eB5SvfqZsGH4UC1W+x1IE+CHNcPehr6PbnSwMGoVL9Gh7aCEzxY4u5jKkvg1W ukLWkNhPQOpo5Hk7uW6+kXVES7ohxL4zux02r27t8aXUIgt1xozhaFqg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=D5Ju29 w9oGQpfixiSPl0UH7PP/WSFw7k6ImRGBx4Pyw=; b=kAbA7m1JsDKZo0XL2HBG4o JBbKl2G89/bRhRdMywsrJvJzOLv/VhPmjuRgUlsHoe4yfmdg8ey6RtHK5xIp3Y1B lu5eCuLvhJnGXRRQjCSXFVuRC4/ULa38FjXw6MdpqKNH/v01AeAlnxs5nQoczrPE f/pMEEdV5Vaom9BesxP5FU21I/gTWS4637BgmjATbbnJZ77d/97fIsrFo0YwTzkd 8KXURxMeKbEzKrtcpZ/aTo+BYvL2DygO/HWoUrIhWJm/iKz6Xj7pec4+pk6EMlxs dHJqcOZ9b4/PW6TtzH3NzBTgUOrJ2gV5HanfaB3pC1ugQcvDvb8fWpB0Pu6Dn74A == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrfedvgdduudelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH v2 1/3] hw/nvme: add struct for zone management send Date: Thu, 27 Jan 2022 09:19:48 +0100 Message-Id: <20220127081950.953572-2-its@irrelevant.dk> X-Mailer: git-send-email 2.35.0 In-Reply-To: <20220127081950.953572-1-its@irrelevant.dk> References: <20220127081950.953572-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.224; envelope-from=its@irrelevant.dk; helo=new2-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, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643274370218100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add struct for Zone Management Send in preparation for more zone send flags. Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 10 ++++------ include/block/nvme.h | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 4344405e5939..7cb4974c5e83 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -3616,26 +3616,24 @@ done: =20 static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, NvmeRequest *req) { - NvmeCmd *cmd =3D (NvmeCmd *)&req->cmd; + NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; NvmeNamespace *ns =3D req->ns; NvmeZone *zone; NvmeZoneResetAIOCB *iocb; uint8_t *zd_ext; - uint32_t dw13 =3D le32_to_cpu(cmd->cdw13); uint64_t slba =3D 0; uint32_t zone_idx =3D 0; uint16_t status; - uint8_t action; + uint8_t action =3D cmd->zsa; bool all; enum NvmeZoneProcessingMask proc_mask =3D NVME_PROC_CURRENT_ZONE; =20 - action =3D dw13 & 0xff; - all =3D !!(dw13 & 0x100); + all =3D cmd->zsflags & NVME_ZSFLAG_SELECT_ALL; =20 req->status =3D NVME_SUCCESS; =20 if (!all) { - status =3D nvme_get_mgmt_zone_slba_idx(ns, cmd, &slba, &zone_idx); + status =3D nvme_get_mgmt_zone_slba_idx(ns, &req->cmd, &slba, &zone= _idx); if (status) { return status; } diff --git a/include/block/nvme.h b/include/block/nvme.h index e3bd47bf76ab..709d491c70d8 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1433,6 +1433,21 @@ enum NvmeZoneType { NVME_ZONE_TYPE_SEQ_WRITE =3D 0x02, }; =20 +typedef struct QEMU_PACKED NvmeZoneSendCmd { + uint8_t opcode; + uint8_t flags; + uint16_t cid; + uint32_t nsid; + uint32_t rsvd8[4]; + NvmeCmdDptr dptr; + uint64_t slba; + uint32_t rsvd48; + uint8_t zsa; + uint8_t zsflags; + uint8_t rsvd54[2]; + uint32_t rsvd56[2]; +} NvmeZoneSendCmd; + enum NvmeZoneSendAction { NVME_ZONE_ACTION_RSD =3D 0x00, NVME_ZONE_ACTION_CLOSE =3D 0x01, @@ -1443,6 +1458,10 @@ enum NvmeZoneSendAction { NVME_ZONE_ACTION_SET_ZD_EXT =3D 0x10, }; =20 +enum { + NVME_ZSFLAG_SELECT_ALL =3D 1 << 0, +}; + typedef struct QEMU_PACKED NvmeZoneDescr { uint8_t zt; uint8_t zs; --=20 2.35.0 From nobody Sun May 5 12:01:44 2024 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1643272810405913.4516885185916; Thu, 27 Jan 2022 00:40:10 -0800 (PST) Received: from localhost ([::1]:50542 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nD0K9-0000rd-6C for importer@patchew.org; Thu, 27 Jan 2022 03:40:09 -0500 Received: from eggs.gnu.org ([209.51.188.92]:55714) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00g-0004fh-3f; Thu, 27 Jan 2022 03:20:02 -0500 Received: from new2-smtp.messagingengine.com ([66.111.4.224]:56551) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00e-0004V3-8f; Thu, 27 Jan 2022 03:20:01 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.nyi.internal (Postfix) with ESMTP id 5876558036A; Thu, 27 Jan 2022 03:19:59 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Thu, 27 Jan 2022 03:19:59 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 27 Jan 2022 03:19:57 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm2; bh=tK4Jy19IE8K6Is OmToHwzs9oXN8F9MtvwA1t/muqngU=; b=MkRX0rIZHL5t4gcQjvNupYzMALK6na W3ojiveykU3AwrpGQ6lov7mBJamkmO3s92YXGLt3LNvG4xin9EmnUyCLeysPmOTB VyX8+lwV7REkVjQL0ibk4IfL0A1Wf4E5OF07vPo6StU3jysivt73eDiSg2hhbZ1n p8fJXWTW9qJ3ya4eM39NJabqdMGfAHzB2ZkpwuFm7IlD338wLCnDU9mQPQlRPVcs 8gKHTCv9dm7W0ejeJQPAK0blXD7XsGKMudkBOmPJudkcngpJhCHza30YR4wxn0OZ 47CKBJXg++RgkieRootpvGdqtFq7L3El9B+p/+/P58Lhvs6r3iUXvexg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=tK4Jy1 9IE8K6IsOmToHwzs9oXN8F9MtvwA1t/muqngU=; b=LwEusmB1cT5dP4sPEC/4fY J64TUGnYXuJEhogjY/XHUuSCpl/EZRZUHbeYyfWM9757GGmIFVKgSE1zUy+odiHj hnW7sFkBqDmAUIpXfGUQtwF6716JunmLKS1GLJCiY4qfr7hkjyNfA+4Kfg9eV46w vKvYvLK9npJD5X94apNYpD2Z7vh7q8jpVWeM5epOtNrCGxazUpPURjE7mNQSKh+Z 8NaoIlvhboK2ZKR77a4zkUQWz7hI3MMenUfcUvOXtlqv3/4xEU+UZ2z9D4d4YbVs d7T+IgnTRw4/gE55k8oZa3cSCHFobO/1lDL/83mACuP8XCp9yDtmIPmQyd1pXq0g == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrfedvgdduudekucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH v2 2/3] hw/nvme: add ozcs enum Date: Thu, 27 Jan 2022 09:19:49 +0100 Message-Id: <20220127081950.953572-3-its@irrelevant.dk> X-Mailer: git-send-email 2.35.0 In-Reply-To: <20220127081950.953572-1-its@irrelevant.dk> References: <20220127081950.953572-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.224; envelope-from=its@irrelevant.dk; helo=new2-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, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643272813985100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add enumeration for OZCS values. Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ns.c | 3 ++- include/block/nvme.h | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 8b5f98c76180..356b6c1c2f14 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -266,7 +266,8 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) id_ns_z->mar =3D cpu_to_le32(ns->params.max_active_zones - 1); id_ns_z->mor =3D cpu_to_le32(ns->params.max_open_zones - 1); id_ns_z->zoc =3D 0; - id_ns_z->ozcs =3D ns->params.cross_zone_read ? 0x01 : 0x00; + id_ns_z->ozcs =3D ns->params.cross_zone_read ? + NVME_ID_NS_ZONED_OZCS_RAZB : 0x00; =20 for (i =3D 0; i <=3D ns->id_ns.nlbaf; i++) { id_ns_z->lbafe[i].zsze =3D cpu_to_le64(ns->zone_size); diff --git a/include/block/nvme.h b/include/block/nvme.h index 709d491c70d8..e10ea6f0eb88 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1351,6 +1351,10 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { uint8_t vs[256]; } NvmeIdNsZoned; =20 +enum NvmeIdNsZonedOzcs { + NVME_ID_NS_ZONED_OZCS_RAZB =3D 1 << 0, +}; + /*Deallocate Logical Block Features*/ #define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat) ((dlfeat) & 0x10) #define NVME_ID_NS_DLFEAT_WRITE_ZEROES(dlfeat) ((dlfeat) & 0x08) --=20 2.35.0 From nobody Sun May 5 12:01:44 2024 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1643274868168410.3310214691469; Thu, 27 Jan 2022 01:14:28 -0800 (PST) Received: from localhost ([::1]:48142 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nD0rK-0002sZ-Pi for importer@patchew.org; Thu, 27 Jan 2022 04:14:27 -0500 Received: from eggs.gnu.org ([209.51.188.92]:55754) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00j-0004kc-HM; Thu, 27 Jan 2022 03:20:05 -0500 Received: from new2-smtp.messagingengine.com ([66.111.4.224]:42069) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD00g-0004Vb-47; Thu, 27 Jan 2022 03:20:04 -0500 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.nyi.internal (Postfix) with ESMTP id 4A7F2580371; Thu, 27 Jan 2022 03:20:01 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Thu, 27 Jan 2022 03:20:01 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 27 Jan 2022 03:19:59 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm2; bh=SF6eTE/Jm14wJ8 Gcx9/SjHNzoUJ54p1M/oeciy4hqXE=; b=jQA5tT1JyskeuX+nhLMf0+uYB4NBq2 NJlaNq1YnURnhUOXWUgWHqSBBBnf3H6YksJ5dvmuaHG1UDgxJ4BjNnzVIA5CyQTi K5PC0uYvwT+Fa5s057sSH5GhUyhVD6Nx/lmJM7c8dzxcUUktbnIBfXQNXql5zpgK NMVKiAYT6oq7C8gBBohhm3jgPpEPghYvzMUAhlE3SPqHvvnuJx2+R/KQGuNM8Hmk xSfzGo6XPg5k/VdQBRHchjKWRt/RBRZMaXdqqRdmpyzVYtCcGXyJV4VpiYK5iS+y lVJVW7zWtGw0tef/Ojvi0vym/oiLxQ+6e6lFb1sHxripJywDWP6mvjmQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=SF6eTE /Jm14wJ8Gcx9/SjHNzoUJ54p1M/oeciy4hqXE=; b=RNnZgCanYwD+vtZ8U1zUrI qq+BTkBwSFtvAqA/z0y7gXovDW9ay1vy3j151RFqpMeCRUtfeXIFYz/4dSxEHiyr zoRoEAePmgyws2KAJwfC4ame4z5hZfBepJXEwZkJASeJllUyJPCz+UB49llT59if u6Ms+W2NhKnZToCDox7CbFC30iYohM/T9XIdl2W2bfLksDYVRsb2pyymSFCo+RrU 6yFBoSXFUInhlWiTgoHwel6K7R0SrdUWVL09ba1E6UMdWYRVSvnEJkAaCYVbeUvZ OLVUbUOcuB0W8Sm52wxlI9uAbPpzZ9i5srjXhRpmM0x3bwokuQsPx6SbTbL2z+Cg == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrfedvgdduudekucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH v2 3/3] hw/nvme: add support for zoned random write area Date: Thu, 27 Jan 2022 09:19:50 +0100 Message-Id: <20220127081950.953572-4-its@irrelevant.dk> X-Mailer: git-send-email 2.35.0 In-Reply-To: <20220127081950.953572-1-its@irrelevant.dk> References: <20220127081950.953572-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.224; envelope-from=its@irrelevant.dk; helo=new2-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, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643274870222100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add support for TP 4076 ("Zoned Random Write Area"), v2021.08.23 ("Ratified"). This adds three new namespace parameters: "zoned.numzrwa" (number of zrwa resources, i.e. number of zones that can have a zrwa), "zoned.zrwas" (zrwa size in LBAs), "zoned.zrwafg" (granularity in LBAs for flushes). Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 171 ++++++++++++++++++++++++++++++++++++++----- hw/nvme/ns.c | 58 +++++++++++++++ hw/nvme/nvme.h | 10 +++ hw/nvme/trace-events | 1 + include/block/nvme.h | 17 ++++- 5 files changed, 237 insertions(+), 20 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 7cb4974c5e83..98aac98bef5f 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -299,26 +299,37 @@ static void nvme_assign_zone_state(NvmeNamespace *ns,= NvmeZone *zone, } } =20 -/* - * Check if we can open a zone without exceeding open/active limits. - * AOR stands for "Active and Open Resources" (see TP 4053 section 2.5). - */ -static int nvme_aor_check(NvmeNamespace *ns, uint32_t act, uint32_t opn) +static uint16_t nvme_zns_check_resources(NvmeNamespace *ns, uint32_t act, + uint32_t opn, uint32_t zrwa) { if (ns->params.max_active_zones !=3D 0 && ns->nr_active_zones + act > ns->params.max_active_zones) { trace_pci_nvme_err_insuff_active_res(ns->params.max_active_zones); return NVME_ZONE_TOO_MANY_ACTIVE | NVME_DNR; } + if (ns->params.max_open_zones !=3D 0 && ns->nr_open_zones + opn > ns->params.max_open_zones) { trace_pci_nvme_err_insuff_open_res(ns->params.max_open_zones); return NVME_ZONE_TOO_MANY_OPEN | NVME_DNR; } =20 + if (zrwa > ns->zns.numzrwa) { + return NVME_NOZRWA | NVME_DNR; + } + return NVME_SUCCESS; } =20 +/* + * Check if we can open a zone without exceeding open/active limits. + * AOR stands for "Active and Open Resources" (see TP 4053 section 2.5). + */ +static uint16_t nvme_aor_check(NvmeNamespace *ns, uint32_t act, uint32_t o= pn) +{ + return nvme_zns_check_resources(ns, act, opn, 0); +} + static bool nvme_addr_is_cmb(NvmeCtrl *n, hwaddr addr) { hwaddr hi, lo; @@ -1628,9 +1639,19 @@ static uint16_t nvme_check_zone_write(NvmeNamespace = *ns, NvmeZone *zone, return status; } =20 - if (unlikely(slba !=3D zone->w_ptr)) { - trace_pci_nvme_err_write_not_at_wp(slba, zone->d.zslba, zone->w_pt= r); - return NVME_ZONE_INVALID_WRITE; + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + uint64_t ezrwa =3D zone->w_ptr + 2 * ns->zns.zrwas; + + if (slba < zone->w_ptr || slba + nlb > ezrwa) { + trace_pci_nvme_err_zone_invalid_write(slba, zone->w_ptr); + return NVME_ZONE_INVALID_WRITE; + } + } else { + if (unlikely(slba !=3D zone->w_ptr)) { + trace_pci_nvme_err_write_not_at_wp(slba, zone->d.zslba, + zone->w_ptr); + return NVME_ZONE_INVALID_WRITE; + } } =20 if (unlikely((slba + nlb) > zcap)) { @@ -1710,6 +1731,14 @@ static uint16_t nvme_zrm_finish(NvmeNamespace *ns, N= vmeZone *zone) /* fallthrough */ case NVME_ZONE_STATE_CLOSED: nvme_aor_dec_active(ns); + + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + zone->d.za &=3D ~NVME_ZA_ZRWA_VALID; + if (ns->params.numzrwa) { + ns->zns.numzrwa++; + } + } + /* fallthrough */ case NVME_ZONE_STATE_EMPTY: nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_FULL); @@ -1745,6 +1774,13 @@ static uint16_t nvme_zrm_reset(NvmeNamespace *ns, Nv= meZone *zone) /* fallthrough */ case NVME_ZONE_STATE_CLOSED: nvme_aor_dec_active(ns); + + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + if (ns->params.numzrwa) { + ns->zns.numzrwa++; + } + } + /* fallthrough */ case NVME_ZONE_STATE_FULL: zone->w_ptr =3D zone->d.zslba; @@ -1778,6 +1814,7 @@ static void nvme_zrm_auto_transition_zone(NvmeNamespa= ce *ns) =20 enum { NVME_ZRM_AUTO =3D 1 << 0, + NVME_ZRM_ZRWA =3D 1 << 1, }; =20 static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, NvmeNamespace *ns, @@ -1796,7 +1833,8 @@ static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, Nvme= Namespace *ns, if (n->params.auto_transition_zones) { nvme_zrm_auto_transition_zone(ns); } - status =3D nvme_aor_check(ns, act, 1); + status =3D nvme_zns_check_resources(ns, act, 1, + (flags & NVME_ZRM_ZRWA) ? 1 : 0); if (status) { return status; } @@ -1824,6 +1862,12 @@ static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, Nvm= eNamespace *ns, /* fallthrough */ =20 case NVME_ZONE_STATE_EXPLICITLY_OPEN: + if (flags & NVME_ZRM_ZRWA) { + ns->zns.numzrwa--; + + zone->d.za |=3D NVME_ZA_ZRWA_VALID; + } + return NVME_SUCCESS; =20 default: @@ -1837,12 +1881,6 @@ static inline uint16_t nvme_zrm_auto(NvmeCtrl *n, Nv= meNamespace *ns, return nvme_zrm_open_flags(n, ns, zone, NVME_ZRM_AUTO); } =20 -static inline uint16_t nvme_zrm_open(NvmeCtrl *n, NvmeNamespace *ns, - NvmeZone *zone) -{ - return nvme_zrm_open_flags(n, ns, zone, 0); -} - static void nvme_advance_zone_wp(NvmeNamespace *ns, NvmeZone *zone, uint32_t nlb) { @@ -1853,6 +1891,20 @@ static void nvme_advance_zone_wp(NvmeNamespace *ns, = NvmeZone *zone, } } =20 +static void nvme_zoned_zrwa_implicit_flush(NvmeNamespace *ns, NvmeZone *zo= ne, + uint32_t nlbc) +{ + uint16_t nzrwafgs =3D DIV_ROUND_UP(nlbc, ns->zns.zrwafg); + + nlbc =3D nzrwafgs * ns->zns.zrwafg; + + trace_pci_nvme_zoned_zrwa_implicit_flush(zone->d.zslba, nlbc); + + zone->w_ptr +=3D nlbc; + + nvme_advance_zone_wp(ns, zone, nlbc); +} + static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req) { NvmeRwCmd *rw =3D (NvmeRwCmd *)&req->cmd; @@ -1865,6 +1917,17 @@ static void nvme_finalize_zoned_write(NvmeNamespace = *ns, NvmeRequest *req) zone =3D nvme_get_zone_by_slba(ns, slba); assert(zone); =20 + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + uint64_t ezrwa =3D zone->w_ptr + ns->zns.zrwas - 1; + uint64_t elba =3D slba + nlb - 1; + + if (elba > ezrwa) { + nvme_zoned_zrwa_implicit_flush(ns, zone, elba - ezrwa); + } + + return; + } + nvme_advance_zone_wp(ns, zone, nlb); } =20 @@ -2665,7 +2728,9 @@ static void nvme_copy_in_completed_cb(void *opaque, i= nt ret) goto invalid; } =20 - iocb->zone->w_ptr +=3D nlb; + if (!(iocb->zone->d.za & NVME_ZA_ZRWA_VALID)) { + iocb->zone->w_ptr +=3D nlb; + } } =20 qemu_iovec_reset(&iocb->iov); @@ -3204,6 +3269,10 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeReque= st *req, bool append, if (append) { bool piremap =3D !!(ctrl & NVME_RW_PIREMAP); =20 + if (unlikely(zone->d.za & NVME_ZA_ZRWA_VALID)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + if (unlikely(slba !=3D zone->d.zslba)) { trace_pci_nvme_err_append_not_at_start(slba, zone->d.zslba= ); status =3D NVME_INVALID_FIELD; @@ -3255,7 +3324,9 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeReques= t *req, bool append, goto invalid; } =20 - zone->w_ptr +=3D nlb; + if (!(zone->d.za & NVME_ZA_ZRWA_VALID)) { + zone->w_ptr +=3D nlb; + } } =20 data_offset =3D nvme_l2b(ns, slba); @@ -3339,7 +3410,24 @@ enum NvmeZoneProcessingMask { static uint16_t nvme_open_zone(NvmeNamespace *ns, NvmeZone *zone, NvmeZoneState state, NvmeRequest *req) { - return nvme_zrm_open(nvme_ctrl(req), ns, zone); + NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; + int flags =3D 0; + + if (cmd->zsflags & NVME_ZSFLAG_ZRWA_ALLOC) { + uint16_t ozcs =3D le16_to_cpu(ns->id_ns_zoned->ozcs); + + if (!(ozcs & NVME_ID_NS_ZONED_OZCS_ZRWASUP)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + + if (zone->w_ptr % ns->zns.zrwafg) { + return NVME_NOZRWA | NVME_DNR; + } + + flags =3D NVME_ZRM_ZRWA; + } + + return nvme_zrm_open_flags(nvme_ctrl(req), ns, zone, flags); } =20 static uint16_t nvme_close_zone(NvmeNamespace *ns, NvmeZone *zone, @@ -3614,6 +3702,44 @@ done: } } =20 +static uint16_t nvme_zone_mgmt_send_zrwa_flush(NvmeCtrl *n, NvmeZone *zone, + uint64_t elba, NvmeRequest = *req) +{ + NvmeNamespace *ns =3D req->ns; + uint16_t ozcs =3D le16_to_cpu(ns->id_ns_zoned->ozcs); + uint64_t wp =3D zone->d.wp; + uint32_t nlb =3D elba - wp + 1; + uint16_t status; + + + if (!(ozcs & NVME_ID_NS_ZONED_OZCS_ZRWASUP)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + + if (!(zone->d.za & NVME_ZA_ZRWA_VALID)) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + if (elba < wp || elba > wp + ns->zns.zrwas) { + return NVME_ZONE_BOUNDARY_ERROR | NVME_DNR; + } + + if (nlb % ns->zns.zrwafg) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + status =3D nvme_zrm_auto(n, ns, zone); + if (status) { + return status; + } + + zone->w_ptr +=3D nlb; + + nvme_advance_zone_wp(ns, zone, nlb); + + return NVME_SUCCESS; +} + static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, NvmeRequest *req) { NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; @@ -3640,7 +3766,7 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, Nvme= Request *req) } =20 zone =3D &ns->zone_array[zone_idx]; - if (slba !=3D zone->d.zslba) { + if (slba !=3D zone->d.zslba && action !=3D NVME_ZONE_ACTION_ZRWA_FLUSH= ) { trace_pci_nvme_err_unaligned_zone_cmd(action, slba, zone->d.zslba); return NVME_INVALID_FIELD | NVME_DNR; } @@ -3716,6 +3842,13 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, Nvm= eRequest *req) } break; =20 + case NVME_ZONE_ACTION_ZRWA_FLUSH: + if (all) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + return nvme_zone_mgmt_send_zrwa_flush(n, zone, slba, req); + default: trace_pci_nvme_err_invalid_mgmt_action(action); status =3D NVME_INVALID_FIELD; diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 356b6c1c2f14..ee673f1a5bef 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -275,6 +275,23 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) ns->params.zd_extension_size >> 6; /* Units of 64B */ } =20 + if (ns->params.zrwas) { + ns->zns.numzrwa =3D ns->params.numzrwa ? + ns->params.numzrwa : ns->num_zones; + + ns->zns.zrwas =3D ns->params.zrwas >> ns->lbaf.ds; + ns->zns.zrwafg =3D ns->params.zrwafg >> ns->lbaf.ds; + + id_ns_z->ozcs |=3D NVME_ID_NS_ZONED_OZCS_ZRWASUP; + id_ns_z->zrwacap =3D NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP; + + id_ns_z->numzrwa =3D cpu_to_le32(ns->params.numzrwa); + id_ns_z->zrwas =3D cpu_to_le16(ns->zns.zrwas); + id_ns_z->zrwafg =3D cpu_to_le16(ns->zns.zrwafg); + } + + id_ns_z->ozcs =3D cpu_to_le16(id_ns_z->ozcs); + ns->csi =3D NVME_CSI_ZONED; ns->id_ns.nsze =3D cpu_to_le64(ns->num_zones * ns->zone_size); ns->id_ns.ncap =3D ns->id_ns.nsze; @@ -315,6 +332,10 @@ static void nvme_clear_zone(NvmeNamespace *ns, NvmeZon= e *zone) QTAILQ_INSERT_HEAD(&ns->closed_zones, zone, entry); } else { trace_pci_nvme_clear_ns_reset(state, zone->d.zslba); + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + zone->d.za &=3D ~NVME_ZA_ZRWA_VALID; + ns->zns.numzrwa++; + } nvme_set_zone_state(zone, NVME_ZONE_STATE_EMPTY); } } @@ -392,6 +413,40 @@ static int nvme_ns_check_constraints(NvmeNamespace *ns= , Error **errp) return -1; } } + + if (ns->params.zrwas) { + if (ns->params.zrwas % ns->blkconf.logical_block_size) { + error_setg(errp, "zone random write area size (zoned.zrwas= " + "%"PRIu64") must be a multiple of the logical " + "block size (logical_block_size %"PRIu32")", + ns->params.zrwas, ns->blkconf.logical_block_siz= e); + return -1; + } + + if (ns->params.zrwafg =3D=3D -1) { + ns->params.zrwafg =3D ns->blkconf.logical_block_size; + } + + if (ns->params.zrwas % ns->params.zrwafg) { + error_setg(errp, "zone random write area size (zoned.zrwas= " + "%"PRIu64") must be a multiple of the zone rand= om " + "write area flush granularity (zoned.zrwafg, " + "%"PRIu64")", ns->params.zrwas, ns->params.zrwa= fg); + return -1; + } + + if (ns->params.max_active_zones) { + if (ns->params.numzrwa > ns->params.max_active_zones) { + error_setg(errp, "number of zone random write area " + "resources (zoned.numzrwa, %d) must be less= " + "than or equal to maximum active resources " + "(zoned.max_active_zones, %d)", + ns->params.numzrwa, + ns->params.max_active_zones); + return -1; + } + } + } } =20 return 0; @@ -551,6 +606,9 @@ static Property nvme_ns_props[] =3D { params.max_open_zones, 0), DEFINE_PROP_UINT32("zoned.descr_ext_size", NvmeNamespace, params.zd_extension_size, 0), + DEFINE_PROP_UINT32("zoned.numzrwa", NvmeNamespace, params.numzrwa, 0), + DEFINE_PROP_SIZE("zoned.zrwas", NvmeNamespace, params.zrwas, 0), + DEFINE_PROP_SIZE("zoned.zrwafg", NvmeNamespace, params.zrwafg, -1), DEFINE_PROP_BOOL("eui64-default", NvmeNamespace, params.eui64_default, true), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 38f3ebf7f6c0..90c0bb7ce236 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -114,6 +114,10 @@ typedef struct NvmeNamespaceParams { uint32_t max_active_zones; uint32_t max_open_zones; uint32_t zd_extension_size; + + uint32_t numzrwa; + uint64_t zrwas; + uint64_t zrwafg; } NvmeNamespaceParams; =20 typedef struct NvmeNamespace { @@ -130,6 +134,12 @@ typedef struct NvmeNamespace { uint16_t status; int attached; =20 + struct { + uint16_t zrwas; + uint16_t zrwafg; + uint32_t numzrwa; + } zns; + QTAILQ_ENTRY(NvmeNamespace) entry; =20 NvmeIdNsZoned *id_ns_zoned; diff --git a/hw/nvme/trace-events b/hw/nvme/trace-events index ff6cafd520df..90730d802fe3 100644 --- a/hw/nvme/trace-events +++ b/hw/nvme/trace-events @@ -103,6 +103,7 @@ pci_nvme_set_descriptor_extension(uint64_t slba, uint32= _t zone_idx) "set zone de pci_nvme_zd_extension_set(uint32_t zone_idx) "set descriptor extension for= zone_idx=3D%"PRIu32"" pci_nvme_clear_ns_close(uint32_t state, uint64_t slba) "zone state=3D%"PRI= u32", slba=3D%"PRIu64" transitioned to Closed state" pci_nvme_clear_ns_reset(uint32_t state, uint64_t slba) "zone state=3D%"PRI= u32", slba=3D%"PRIu64" transitioned to Empty state" +pci_nvme_zoned_zrwa_implicit_flush(uint64_t zslba, uint32_t nlb) "zslba 0x= %"PRIx64" nlb %"PRIu32"" =20 # error conditions pci_nvme_err_mdts(size_t len) "len %zu" diff --git a/include/block/nvme.h b/include/block/nvme.h index e10ea6f0eb88..cd068ac89142 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -890,6 +890,8 @@ enum NvmeStatusCodes { NVME_INVALID_PROT_INFO =3D 0x0181, NVME_WRITE_TO_RO =3D 0x0182, NVME_CMD_SIZE_LIMIT =3D 0x0183, + NVME_INVALID_ZONE_OP =3D 0x01b6, + NVME_NOZRWA =3D 0x01b7, NVME_ZONE_BOUNDARY_ERROR =3D 0x01b8, NVME_ZONE_FULL =3D 0x01b9, NVME_ZONE_READ_ONLY =3D 0x01ba, @@ -1345,7 +1347,12 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { uint32_t mor; uint32_t rrl; uint32_t frl; - uint8_t rsvd20[2796]; + uint8_t rsvd12[24]; + uint32_t numzrwa; + uint16_t zrwafg; + uint16_t zrwas; + uint8_t zrwacap; + uint8_t rsvd53[2763]; NvmeLBAFE lbafe[16]; uint8_t rsvd3072[768]; uint8_t vs[256]; @@ -1353,6 +1360,11 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { =20 enum NvmeIdNsZonedOzcs { NVME_ID_NS_ZONED_OZCS_RAZB =3D 1 << 0, + NVME_ID_NS_ZONED_OZCS_ZRWASUP =3D 1 << 1, +}; + +enum NvmeIdNsZonedZrwacap { + NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP =3D 1 << 0, }; =20 /*Deallocate Logical Block Features*/ @@ -1408,6 +1420,7 @@ enum NvmeZoneAttr { NVME_ZA_FINISHED_BY_CTLR =3D 1 << 0, NVME_ZA_FINISH_RECOMMENDED =3D 1 << 1, NVME_ZA_RESET_RECOMMENDED =3D 1 << 2, + NVME_ZA_ZRWA_VALID =3D 1 << 3, NVME_ZA_ZD_EXT_VALID =3D 1 << 7, }; =20 @@ -1460,10 +1473,12 @@ enum NvmeZoneSendAction { NVME_ZONE_ACTION_RESET =3D 0x04, NVME_ZONE_ACTION_OFFLINE =3D 0x05, NVME_ZONE_ACTION_SET_ZD_EXT =3D 0x10, + NVME_ZONE_ACTION_ZRWA_FLUSH =3D 0x11, }; =20 enum { NVME_ZSFLAG_SELECT_ALL =3D 1 << 0, + NVME_ZSFLAG_ZRWA_ALLOC =3D 1 << 1, }; =20 typedef struct QEMU_PACKED NvmeZoneDescr { --=20 2.35.0