From nobody Sun Feb 8 12:14:51 2026 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 164482760506216.199102395350792; Mon, 14 Feb 2022 00:33:25 -0800 (PST) Received: from localhost ([::1]:34460 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJWnT-0001Sl-IY for importer@patchew.org; Mon, 14 Feb 2022 03:33:23 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39908) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPD-000373-Az; Mon, 14 Feb 2022 03:08:19 -0500 Received: from new1-smtp.messagingengine.com ([66.111.4.221]:48021) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPA-0007WF-LU; Mon, 14 Feb 2022 03:08:19 -0500 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.nyi.internal (Postfix) with ESMTP id 02610580299; Mon, 14 Feb 2022 03:08:10 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Mon, 14 Feb 2022 03:08:10 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:07 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type: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=cOflEPnncivYUW RGbT02cDFj2BD4jaUZvoqM6s7ofIo=; b=IoSD7MAnSTCmh38l7AjVQjC6DXsUNL uWzixa0k/DKqtCs1F1PsebjIHz/+kOGpJDinf7PXE37rMmN09dIv9TlhCIlrvSBh jNHoTt854G9D7lrAvLq8C6ZDOututQ7wgWHVgaNGzR8Dfa0A9TTKUP17DA+gZAJJ 40hiHPTZVIMIsWp+C5mQz/ivqtKHsPtp06V9pbeW5AingBi7GuP3kLd5JhaEm3eu +MY8s06aJlMIqtvfwwkNEtz8lSirrpgsMJGhGdI+HUvJRe8uvOCo44ZYxQwl6ET6 2BQttF082yc0FKBBRCbyTdpR6RtOfg0jl5jREH/QB04HV2gjjLCkgFng== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type: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=fm2; bh=cOflEPnncivYUWRGbT02cDFj2BD4jaUZvoqM6s7of Io=; b=aAf50NGSP7voveQo9EkV6VCUaQc+MpI3huLLmLNzuk3NFPwyU26Q/W+Gc SA6aYgfTC3vAovMgaE6zSYNYkWj0nTHWH3JeDNvlePp25VYEDGsUoAq3dwnXSc8S TZtvxfB0pRJ8LV7rALjczgS8CQMnm/OlAHuZq6HiQPb7A/b5Wp1MxuSF1Fle25fd G55eHBfSjxTeNDuyT1KvqmltCSwZljvYS1GHSrhI36sjsRTpWRZkoNCyeUUpZ1rV 4uybIm+uyf5XYoAe9o5cX3KxQH0fNSLpXgdzhljVKlKYLiHzKiJU2xR2BU38qSr9 lDoPZiLUMiOC2GNU6YqliwVcjpeHQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepmfhlrghu shculfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrth htvghrnhepteevuedugeevieehgeeileeufeetvddtkeetfeelgeehudfhjeeuledvhfff tdegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepih htshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 1/6] hw/nvme: fix CVE-2021-3929 Date: Mon, 14 Feb 2022 09:07:56 +0100 Message-Id: <20220214080801.13627-2-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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.221; envelope-from=its@irrelevant.dk; helo=new1-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.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Qiuhao Li , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1644827607494100001 From: Klaus Jensen This fixes CVE-2021-3929 "locally" by denying DMA to the iomem of the device itself. This still allows DMA to MMIO regions of other devices (e.g. doing P2P DMA to the controller memory buffer of another NVMe device). Fixes: CVE-2021-3929 Reported-by: Qiuhao Li Reviewed-by: Keith Busch Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 1f62116af985..37681a975986 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -357,6 +357,24 @@ static inline void *nvme_addr_to_pmr(NvmeCtrl *n, hwad= dr addr) return memory_region_get_ram_ptr(&n->pmr.dev->mr) + (addr - n->pmr.cba= ); } =20 +static inline bool nvme_addr_is_iomem(NvmeCtrl *n, hwaddr addr) +{ + hwaddr hi, lo; + + /* + * The purpose of this check is to guard against invalid "local" acces= s to + * the iomem (i.e. controller registers). Thus, we check against the r= ange + * covered by the 'bar0' MemoryRegion since that is currently composed= of + * two subregions (the NVMe "MBAR" and the MSI-X table/pba). Note, how= ever, + * that if the device model is ever changed to allow the CMB to be loc= ated + * in BAR0 as well, then this must be changed. + */ + lo =3D n->bar0.addr; + hi =3D lo + int128_get64(n->bar0.size); + + return addr >=3D lo && addr < hi; +} + static int nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size) { hwaddr hi =3D addr + size - 1; @@ -614,6 +632,10 @@ static uint16_t nvme_map_addr(NvmeCtrl *n, NvmeSg *sg,= hwaddr addr, size_t len) =20 trace_pci_nvme_map_addr(addr, len); =20 + if (nvme_addr_is_iomem(n, addr)) { + return NVME_DATA_TRAS_ERROR; + } + if (nvme_addr_is_cmb(n, addr)) { cmb =3D true; } else if (nvme_addr_is_pmr(n, addr)) { --=20 2.35.1 From nobody Sun Feb 8 12:14:51 2026 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 1644826876970564.8842685849527; Mon, 14 Feb 2022 00:21:16 -0800 (PST) Received: from localhost ([::1]:48520 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJWbi-0008H7-2c for importer@patchew.org; Mon, 14 Feb 2022 03:21:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39906) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPD-00036y-7H; Mon, 14 Feb 2022 03:08:19 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:42725) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPA-0007WS-Lq; Mon, 14 Feb 2022 03:08:18 -0500 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.west.internal (Postfix) with ESMTP id AEB4F2B001D9; Mon, 14 Feb 2022 03:08:12 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Mon, 14 Feb 2022 03:08:13 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:10 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type: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=F/eErYpa2I1tv2 iZA0vK2tT6B6vhC5CCDwx5Ep9eCmU=; b=bVO09q79/55G90T8LWCit3B3x6ljv7 g8ovQo4r9ZT208NSQMA7fwzSlO97bWobR1a6585mcSj0/8aTOQgoyDclJxZuj95q pJn4tUvSSur9nM0I0xzIlVjwZUYGlTP6Of5tS/4X94mbG6JawCBKWMUcjyGkkhVn w8FuzGGVMCQvTeOu92fVJLpW7k5aWEptRxwkqWVrS/Thgxf2hObclqIns+IEW5CB Xj8wvGbDTFJWmaCWqZ11WPQSW+6qi91HNiM3eZVW/fTPU1BvwKSEH1NxKwqrC77s 61BVj08yCCe5GbH9h8PgQzACxh6SjPIPxT5pE/Cp2QXTLx0cQNb6eKig== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type: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=fm2; bh=F/eErYpa2I1tv2iZA0vK2tT6B6vhC5CCDwx5Ep9eC mU=; b=cZvoSyIbUBEWdjmiotiBjcoIQYOcgK0iIgy9RqvFjso7vSemoZ9rXVx1b uh2FoEb5KVJwJhr2z5Ennvj6oetOlsgMvQub6/o4Na4p+gB+8YaQGibWykAdF5kT C7BIExMnMeh9lhfwNkdpdxrH9IPTwg0l6rHBufZJLCJ73MRSvFg0QBcdQUw5pGic ypg1pLdYuPEKgbr9nX5hlZirIIr7xfIjhqLZMdFbGEZgJO9Yqu+c7gOMowwQZq4y Vuq01O4sDxZlhzp6hqX5gGyzYvoAqzj5H2hSQbXhQeSXcVHZatIq22y46pEm2xX0 LpvOOlFxkpeRlZROCaByogghFV2jw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepmfhlrghu shculfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrth htvghrnhepteevuedugeevieehgeeileeufeetvddtkeetfeelgeehudfhjeeuledvhfff tdegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepih htshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 2/6] hw/nvme/ctrl: Have nvme_addr_write() take const buffer Date: Mon, 14 Feb 2022 09:07:57 +0100 Message-Id: <20220214080801.13627-3-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, 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: 1644826879906100001 From: Philippe Mathieu-Daud=C3=A9 The 'buf' argument is not modified, so better pass it as const type. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Klaus Jensen Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 37681a975986..12e1fcda7c85 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -395,7 +395,7 @@ static int nvme_addr_read(NvmeCtrl *n, hwaddr addr, voi= d *buf, int size) return pci_dma_read(&n->parent_obj, addr, buf, size); } =20 -static int nvme_addr_write(NvmeCtrl *n, hwaddr addr, void *buf, int size) +static int nvme_addr_write(NvmeCtrl *n, hwaddr addr, const void *buf, int = size) { hwaddr hi =3D addr + size - 1; if (hi < addr) { --=20 2.35.1 From nobody Sun Feb 8 12:14:51 2026 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 1644827557224726.2541372948405; Mon, 14 Feb 2022 00:32:37 -0800 (PST) Received: from localhost ([::1]:33652 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJWmh-0000mj-VJ for importer@patchew.org; Mon, 14 Feb 2022 03:32:36 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39932) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPF-00038o-2U; Mon, 14 Feb 2022 03:08:21 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:42697) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPD-0007X5-8s; Mon, 14 Feb 2022 03:08:20 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.west.internal (Postfix) with ESMTP id 7C4C12B001E3; Mon, 14 Feb 2022 03:08:16 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 14 Feb 2022 03:08:17 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:13 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type: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=dDcC9RWWToGabc yYbYZAPPfmTkp1ESis0HbzBRxiX9k=; b=opB7V0VInk3uDnJqLGzgTmr4G0/2ko 0dHL3Swa9KE0DAekF08lvic3RwKVwO31NaUyQub/HEygAiF42A+KSHzl41mF9y8V b8KXAweyqGg2uDzTfRM09q14NpMIue66/5x/8j7z7OM3VK9gb6fTcPoGtvxQkPzk 5WiuzDtsaBuGQ9asBi3Vz3sDD5pWx8YcMnhA4Cdb41R7wykP9QMpv81L5dpc7ThR gXrZoaH7877CIJG0hQHLnnzebwSRIB5FDs6pqrcLQoIZDDo7fzVNrqkurtO5Az+2 mNrn2gYGYkSvYXaKaNOw+Ei600ftzjo8sqnhEam7rL8qYxhxIZbgNtLQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type: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=fm2; bh=dDcC9RWWToGabcyYbYZAPPfmTkp1ESis0HbzBRxiX 9k=; b=DCiAVU0Vo4WXU6h1UhA6bLmASyidSwf8mJj0lLMBoZkO33P9blEPMo9si 88X8KHF87hPGk5hZrxPV/dkKR87dIp9WlKplVONooRY8QxGwZuFLDF32EfX6AC54 jwRX2s2ATqE5fbBanoE4oAw+RcGwRyPgL1zuh+/kPlG/2UdJjkR1961I5xi4dZcf llEukTxi5G+ar4jyCDMHusSiT8L5/iLAnXzhpdPu/sjSnSFtQA2vn9TX3RsDWwQe ERhjGiJMZxXduu0Us2R2yPQC3MnAE0ZSWpqf9hLw8ppkjrMVfG2IDDoqWSiR66l+ 5WiYqybraoznSDvrH3rnGX5anx3oA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepmfhlrghu shculfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrth htvghrnhepteevuedugeevieehgeeileeufeetvddtkeetfeelgeehudfhjeeuledvhfff tdegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepih htshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 3/6] hw/nvme/ctrl: Pass buffers as 'void *' types Date: Mon, 14 Feb 2022 09:07:58 +0100 Message-Id: <20220214080801.13627-4-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, 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: 1644827559047100001 From: Philippe Mathieu-Daud=C3=A9 These buffers can be anything, not an array of chars, so use the 'void *' type for them. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Klaus Jensen Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 10 +++++----- hw/nvme/nvme.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 12e1fcda7c85..4344405e5939 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -1162,7 +1162,7 @@ static uint16_t nvme_tx_interleaved(NvmeCtrl *n, Nvme= Sg *sg, uint8_t *ptr, return NVME_SUCCESS; } =20 -static uint16_t nvme_tx(NvmeCtrl *n, NvmeSg *sg, uint8_t *ptr, uint32_t le= n, +static uint16_t nvme_tx(NvmeCtrl *n, NvmeSg *sg, void *ptr, uint32_t len, NvmeTxDirection dir) { assert(sg->flags & NVME_SG_ALLOC); @@ -1199,7 +1199,7 @@ static uint16_t nvme_tx(NvmeCtrl *n, NvmeSg *sg, uint= 8_t *ptr, uint32_t len, return NVME_SUCCESS; } =20 -static inline uint16_t nvme_c2h(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +static inline uint16_t nvme_c2h(NvmeCtrl *n, void *ptr, uint32_t len, NvmeRequest *req) { uint16_t status; @@ -1212,7 +1212,7 @@ static inline uint16_t nvme_c2h(NvmeCtrl *n, uint8_t = *ptr, uint32_t len, return nvme_tx(n, &req->sg, ptr, len, NVME_TX_DIRECTION_FROM_DEVICE); } =20 -static inline uint16_t nvme_h2c(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +static inline uint16_t nvme_h2c(NvmeCtrl *n, void *ptr, uint32_t len, NvmeRequest *req) { uint16_t status; @@ -1225,7 +1225,7 @@ static inline uint16_t nvme_h2c(NvmeCtrl *n, uint8_t = *ptr, uint32_t len, return nvme_tx(n, &req->sg, ptr, len, NVME_TX_DIRECTION_TO_DEVICE); } =20 -uint16_t nvme_bounce_data(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +uint16_t nvme_bounce_data(NvmeCtrl *n, void *ptr, uint32_t len, NvmeTxDirection dir, NvmeRequest *req) { NvmeNamespace *ns =3D req->ns; @@ -1241,7 +1241,7 @@ uint16_t nvme_bounce_data(NvmeCtrl *n, uint8_t *ptr, = uint32_t len, return nvme_tx(n, &req->sg, ptr, len, dir); } =20 -uint16_t nvme_bounce_mdata(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +uint16_t nvme_bounce_mdata(NvmeCtrl *n, void *ptr, uint32_t len, NvmeTxDirection dir, NvmeRequest *req) { NvmeNamespace *ns =3D req->ns; diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 83ffabade4cf..38f3ebf7f6c0 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -495,9 +495,9 @@ static inline uint16_t nvme_cid(NvmeRequest *req) } =20 void nvme_attach_ns(NvmeCtrl *n, NvmeNamespace *ns); -uint16_t nvme_bounce_data(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +uint16_t nvme_bounce_data(NvmeCtrl *n, void *ptr, uint32_t len, NvmeTxDirection dir, NvmeRequest *req); -uint16_t nvme_bounce_mdata(NvmeCtrl *n, uint8_t *ptr, uint32_t len, +uint16_t nvme_bounce_mdata(NvmeCtrl *n, void *ptr, uint32_t len, NvmeTxDirection dir, NvmeRequest *req); void nvme_rw_complete_cb(void *opaque, int ret); uint16_t nvme_map_dptr(NvmeCtrl *n, NvmeSg *sg, size_t len, --=20 2.35.1 From nobody Sun Feb 8 12:14:51 2026 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 16448281779011.858043379277433; Mon, 14 Feb 2022 00:42:57 -0800 (PST) Received: from localhost ([::1]:43290 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJWwi-0007gt-4z for importer@patchew.org; Mon, 14 Feb 2022 03:42:56 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39984) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPW-0003B8-9T; Mon, 14 Feb 2022 03:08:38 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:46039) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPG-0007Xl-Si; Mon, 14 Feb 2022 03:08:25 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.west.internal (Postfix) with ESMTP id 1AE382B001D9; Mon, 14 Feb 2022 03:08:20 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 14 Feb 2022 03:08:21 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:17 -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=szWnx2TgghT4kr anW41Qedy8ps34nmWCXbpWfNleVnw=; b=LL13hrNktttnqjLY7UYnLKloK3XxmS hTsubAF7U6/DRIKP+rHcDnBc96wsZeYph+cDk/Hq8zLrtXnXncWW2aGfZ96CQIxh UEFGb762kMoX34hxj2yaCzHPiWAzvCb+Ey91hwvxsErSq8FkgwBbsdfBd4icJH2k QOb4DEqysM9xjo5ZJOoj5bobjo7x+Z35mlkAHEoGI3+l2WfMlvn4QEGVW0AcSTkN w1yzpg0EUlydKfUqaaYztOdF/APE9EQIKnxK2PDLGsgUEV5FY9xqd6m46YOngQUs jwH6eq51nlWRbA1+U1dzJyxM8jg0wblxt4SI2sx4K8kT7adwyOYi/Mhw== 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=fm2; bh=szWnx2 TgghT4kranW41Qedy8ps34nmWCXbpWfNleVnw=; b=St4yHfPRrAB/xPQPmKw2wg CN5U0pPQK/FEmo5/zclHWGBnrzKRJatfR1sxpTXZ9UXei6JJEMn5TY+w6fymwr5Y b+tzs/GVBMmA1Hk4c8nwcn1oK1UCkG/yU3+R1QSckfr7Ajoh2QBZXCNZmqrAzrfu rxqkl+fDPZiU1Sd5TMpd/oovCgzVAi7pEOSvlAV0hRc9yHjP50dSHmrX+ws33EyU qk5Z9JcEQyjf8Qhy4/NZK9y9OWjqINnQK7Ok1YS+IyCu6R0I9/wYgBusuNAtE4Q4 +qMgSkrt1bESoq+iD9mzX+2WAZ27WberUp5WQ3RkA8BH1HG/J4H0opy8e+Hpc0tg == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 4/6] hw/nvme: add struct for zone management send Date: Mon, 14 Feb 2022 09:07:59 +0100 Message-Id: <20220214080801.13627-5-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1644828180059100001 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.1 From nobody Sun Feb 8 12:14:51 2026 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 1644829044215962.5483860864858; Mon, 14 Feb 2022 00:57:24 -0800 (PST) Received: from localhost ([::1]:54308 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJXAg-0007C7-Rl for importer@patchew.org; Mon, 14 Feb 2022 03:57:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:40020) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPY-0003DK-Lq; Mon, 14 Feb 2022 03:08:40 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:55935) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPW-0007YD-DE; Mon, 14 Feb 2022 03:08:40 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.west.internal (Postfix) with ESMTP id DACF32B001E3; Mon, 14 Feb 2022 03:08:23 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 14 Feb 2022 03:08:24 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:21 -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=iZgRhve8kfQhRl VQ/BzOZXFT81EUsS6mQ5C3w3qprtI=; b=ibWnXgWRq89rxE+gRDnBhRWkwPSjFP FF+s27xNoKaBEZuuH+is9+DnEY6wmVNQQpaO4P6VWmtfiAw/5dHlHflAcVU8kzPn qgG4T6F1dqNTAdgx3W0pagV+pyrrLmkpzRLbvUdb61qfBfDfdcRG3f5VbOHjFGAD 3s8y8v10Soom1nfRkyLAvH9dEw2JPvRohJLkT4f72c911ScMaYNoEjtWt6FLSvYn AjfEwIYK0C1RE0LqdsXSEbFKdGPfB18CMY9Y257Fu6SkxORX3fTEKJoo2DWAxMOp qdkh0S6N2u4mHI18ECyPAKBuqN3KUL0WWoowRO3DOIvUEgMVwRwFWqJQ== 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=fm2; bh=iZgRhv e8kfQhRlVQ/BzOZXFT81EUsS6mQ5C3w3qprtI=; b=K6HymveSHYvbleQHO1obT7 3Cg6hbhqaLOjEXmv2ZVALwjxlaWuLEOLi6kdQ2gE4khVf+0wHB7fOsW3/gVf+gQw irVn0Pqt9982csUH71CfpB+z8JAuFfO0qmrCZ+c6wbABYbLqwj6Ngl9pr0k8Cx/W naRLh5c7BueHwYrE/+h/eVaDsPPJwn10RB41bicCbjphJsHKKoVL75wc4lCG/2xn NT3tFuDuS/0sEbGIPhVraGy4kZB//OXN8vveNuziUWH1BWx7DhgsPVKFSbxHK9d/ HwssXBu7rpxkiHosdZ1BsrRkdjmb36KYxtmDDKQIDtNhOW8hUEzUWw+5j9OsuXcQ == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 5/6] hw/nvme: add ozcs enum Date: Mon, 14 Feb 2022 09:08:00 +0100 Message-Id: <20220214080801.13627-6-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1644829046432100001 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.1 From nobody Sun Feb 8 12:14:51 2026 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 1644826988851643.7449745703744; Mon, 14 Feb 2022 00:23:08 -0800 (PST) Received: from localhost ([::1]:51426 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nJWdT-0001y4-Tr for importer@patchew.org; Mon, 14 Feb 2022 03:23:07 -0500 Received: from eggs.gnu.org ([209.51.188.92]:40022) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPZ-0003Do-3b; Mon, 14 Feb 2022 03:08:41 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:59189) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nJWPW-0007YR-Fk; Mon, 14 Feb 2022 03:08:40 -0500 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailnew.west.internal (Postfix) with ESMTP id 8C6E32B0015C; Mon, 14 Feb 2022 03:08:27 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Mon, 14 Feb 2022 03:08:28 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Feb 2022 03:08:25 -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=1ZZKmJeVYriP75 3y9sJAkTgnZM6SlzDl9T7lyhPWLH8=; b=NFYJZc1vbtDAOP4KvQiaEgJtEnP1En etFxnC1ZgPPxrGeNjCmt0d3YFcWpOxhAiACirkA68cwgMKpoTJcxls/vzG7d2cyU L58Ti8n9OSGn6G49Dng2i8j6xdlHfPTPrX8tTaqprFIou2RrMOa44MFGotnU76Sk WRse5KU400hoF8OzNja0lXD0nE1+p1SbTTz4/V7DQeEHjE0nsKdSfx6BIOmUGGwb hFH/Z+fLJ7ZG9eDL8yODQTtsDXTrLpEMJXXDeWZ8wgpZBhO1BmqkvobeHVH0aPWO I4Xfia6sx2tOfRqpie5eKIi26tvlIZlulRgo3URvqYPvsuQSNWjVmHjA== 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=fm2; bh=1ZZKmJ eVYriP753y9sJAkTgnZM6SlzDl9T7lyhPWLH8=; b=X3akDxPaskdUaVJhPUKYFK 9xkLn21LpTfjKCq2wFkS8Yj+mcRCg6VrzO8FlUAhE4QnQciF6BRe+nuttKUdQP2R MY9FJyeeYM1WJ/PxQtxUR/bPCeR5QGxq14Lc0ft3LxGWobZkWz1EEkw1V7b5uRGS CKFHuQ0QshyaJG+RyP06pIcaHyMNaW3woQLrJuCU6FAVaNyK7fNa+OXAcLIL8LAn tfCZlJwZdE3TTd+esMxgAsl7Xcf8x8o3xbZtJyaeLNIvHT6RBph3epVzkvG+SdO+ btBBXUIEagOcnzzowgwl9752LIwiplwEs9EqGCqhuL8YKp98nTtTG9EgkJF0FU6Q == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrjedugdduudehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 6/6] hw/nvme: add support for zoned random write area Date: Mon, 14 Feb 2022 09:08:01 +0100 Message-Id: <20220214080801.13627-7-its@irrelevant.dk> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220214080801.13627-1-its@irrelevant.dk> References: <20220214080801.13627-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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, T_SCC_BODY_TEXT_LINE=-0.01 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 , qemu-block@nongnu.org, Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Klaus Jensen , Hanna Reitz , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1644826995207100001 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.1