From nobody Thu May 16 16:14:29 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 ARC-Seal: i=1; a=rsa-sha256; t=1611912064; cv=none; d=zohomail.com; s=zohoarc; b=Ud+W/At1m5A3yJgFSBYgPBX9bj69kHAeOjRv5gETKvU9WwXeRpjkCkmZXL1zC3l6EZxMxZvOqtH/puJhXll0/RnF520Jl7WCEaZJLIh9W35NkOKqkpxpQfP5+Uf75RQ0mHq1NLYIZan2WWjgYEU7UcnN6o0FIvRL0+aAT5F97Uw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611912064; 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=Lo+4riIA8vp3OaiYbYivYwogK1MChPVXI3VUQclJtHM=; b=Tna4esNCVGi/RzVAdhmb4Gooqc1dhiRXO50v0Wev92gxI4aiXKtF/Cxzv74aqszfUHQR9Ut6iutW22L/KSdQGW7VnR3KTD1SoKCq6BDhnlEzCCmfrwdcf2uqheaRE75PD7qr80OK8Kfi7FrsMVfbYXKML6NZOlGkzzLkl69T38M= 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 1611912063842682.6366849551583; Fri, 29 Jan 2021 01:21:03 -0800 (PST) Received: from localhost ([::1]:42518 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5Pxe-00009C-Dp for importer@patchew.org; Fri, 29 Jan 2021 04:21:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43194) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Pse-0006TJ-W2; Fri, 29 Jan 2021 04:15:53 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:52037) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psb-0003cX-KO; Fri, 29 Jan 2021 04:15:52 -0500 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id EAC885C01E9; Fri, 29 Jan 2021 04:15:46 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Fri, 29 Jan 2021 04:15:46 -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 88BD5240069; Fri, 29 Jan 2021 04:15:45 -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=fm2; bh=Lo+4riIA8vp3O aiYbYivYwogK1MChPVXI3VUQclJtHM=; b=RHTpinc2EiShUrwv1qcdEZCCbaop3 7CiDNzogH52Iheeig3fByNwi+x9Rzrd44034QQK6IYsFokCMu2+56+bbjfG1xtH8 IOxiwIxgrN7E8V0suhOaABFDWVGNRPUhCDqWiNvo+DJPNfsvV377JAVT4Lcnvq3j i+Gvou8OMI8qqtJONMtvkut4ndRW7IrotLkNhMLm3J6zSSeiQzO5faNkRTlAEH1z +uIVb5JziLCYsHel6ks04JOVgK7ppHl0iWsrfEtFTnOiwK3+b9AA9QluMUD3z5N7 VraHaKt8tgA1gqg9LNlwqeRVcUgKs8PR6qg5jshqTgabRMiXbHS00rDtw== 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=Lo+4riIA8vp3OaiYbYivYwogK1MChPVXI3VUQclJtHM=; b=VFf3UXX/ iz0RjcWG6EzhOj3s6Pp0USxpTLwpNMAqSeMlqblt3gZrkyh+IU+4/efJabIFLKkS KNlLWlxxo1+Nx+L6ma7AVX+KZilfjBwqsGrl7b8ykl6HdO3PqifvKCoFB6ZsfWbq FwdGAVD6D9JK9tiFcQOcxSVqEaPb/KGNF9MiMEPf9DZTRgXo97IZ8FrfAP/iFnLd 5KlnCyXdSyMYRh38EXl7XYORmksFYl5//yYWT3uvbNRRim5b4dAzcX9lPR/0f1l1 K04rOiTvwvnH9zycwJz2TwrhuDKIWcnojSZDt6OOsgfNpxcCDOZm30o+/45Hed6R 5Beqbopgx/15NA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvgddtudcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepueelteegieeuhffgkeefgfevjeeigfetkeeitdfgtdeifefhtdfhfeeuffevgfek necukfhppeektddrudeijedrleekrdduledtnecuvehluhhsthgvrhfuihiivgeptdenuc frrghrrghmpehmrghilhhfrhhomhepihhtshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 1/5] hw/block/nvme: remove unused parameter in check zone write Date: Fri, 29 Jan 2021 10:15:37 +0100 Message-Id: <20210129091541.566330-2-its@irrelevant.dk> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129091541.566330-1-its@irrelevant.dk> References: <20210129091541.566330-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.29; envelope-from=its@irrelevant.dk; helo=out5-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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Remove the unused NvmeCtrl parameter in nvme_check_zone_write. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/block/nvme.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 8ac997735041..79d9563a17bd 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1183,9 +1183,8 @@ static uint16_t nvme_check_zone_state_for_write(NvmeZ= one *zone) } } =20 -static uint16_t nvme_check_zone_write(NvmeCtrl *n, NvmeNamespace *ns, - NvmeZone *zone, uint64_t slba, - uint32_t nlb) +static uint16_t nvme_check_zone_write(NvmeNamespace *ns, NvmeZone *zone, + uint64_t slba, uint32_t nlb) { uint64_t zcap =3D nvme_zone_wr_boundary(zone); uint16_t status; @@ -1748,7 +1747,7 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeReques= t *req, bool append, res->slba =3D cpu_to_le64(slba); } =20 - status =3D nvme_check_zone_write(n, ns, zone, slba, nlb); + status =3D nvme_check_zone_write(ns, zone, slba, nlb); if (status) { goto invalid; } --=20 2.30.0 From nobody Thu May 16 16:14:29 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 ARC-Seal: i=1; a=rsa-sha256; t=1611912395; cv=none; d=zohomail.com; s=zohoarc; b=GSuyRPjtk0/q3dk2VAlaL8gg1jgmS+9JeniCfmOCsDbp9SmL0aZbHiYSEoPOWxse3rXx4uTDV4bBGPzoJNZqrAfnSgvpc+nnASW+IDXOc0gCoOJlS/y+KyrCF7i24nVAol7S7JQYQufVLafEaAwvu9q9CJ3Zjt0ZF4SFdYp4Tjc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611912395; 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=wcsi0gEeXD5s74/npc840Eno5B8IE2vnOkxkaHOeBis=; b=kHGgBeQN13L3O242ihdgwsdKPyn1RJnzeK97vyZgc0Afp82BBFgLvv0bK1Xgj9Y4q0G8L9dJuk1t3J8DGgEO2MjnXYThC45tq96KjJvoBG9ASFnjbx69fZwe7uGQifqRupsmxEgwVp7xnkou2B1oKlWSXjtpCwvo7ItLUN8dlQs= 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 1611912395011285.10212542054717; Fri, 29 Jan 2021 01:26:35 -0800 (PST) Received: from localhost ([::1]:50808 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5Q2z-0003iZ-La for importer@patchew.org; Fri, 29 Jan 2021 04:26:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43236) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psi-0006Tz-Io; Fri, 29 Jan 2021 04:15:56 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:34045) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psb-0003ck-HP; Fri, 29 Jan 2021 04:15:56 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 178A15C01E5; Fri, 29 Jan 2021 04:15:48 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 29 Jan 2021 04:15:48 -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 DD70E24005B; Fri, 29 Jan 2021 04:15:46 -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=fm2; bh=wcsi0gEeXD5s7 4/npc840Eno5B8IE2vnOkxkaHOeBis=; b=jwdpuBo1bAkt2pXXKP3Q5qRmbmTSa FE43m5b4ZzyIqJx7ijQXcD97EgUFPHuPGEoUNa6lJGIu335deRRnwMqs3ecknePx 4UC6iKWLNgwB027V7hlQcyFTz9oTnOdLjlDR6zbDjQKexsHwdeeGb3P0rQAf39L2 dSCR301T40DjbMzkLtKRyDFpCaSgeDi44zEHq/HhTgyETMDYxo71fCObLfCdj13/ 1hPmBBFfHiTKIMiNVhVTPB7Ms3sUgvYXAJNa61y3H05YEs6JxBsbbHXZiHC7721X ntiKoyX8d09v5M12M5fhdAOEknP4hkl2cI1cLRcJ79q2bJXUZ/E8sV/Lg== 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=wcsi0gEeXD5s74/npc840Eno5B8IE2vnOkxkaHOeBis=; b=oW7UJLKQ tbsPRtURXneivw8tTeLK94aRUzVrZlkVC0ncCAws2fH3sfLrk6w+cb+2BY7NL2MD ULNeXC0Q+GK1Y5HCC6RA3mr6UNP5DbdxSsKt+wbnVlWrc6QucMDIbVfORfBfLwnN ARBnfOcVlvXT6q24ZLAeIy/+q39wn/HkckAPlnkp17/HJQRox5rvInLXmgOX1ci5 xCdefurZILh9DN9/sw1NYem00ycY8w/6QgCCA55qRdFnOub+vC2TWCFfMrGz+KP5 OilYUJdW5O9LTwbJZTy1uRSj01B2Juu4xRfCMk1c5DYeDw7Z+0f7StX5Zx0BaCFy hh+sWEb0dv2wUQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvucetufdoteggodetrfdotffvucfrrh hofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurh ephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhsucflvghn shgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtthgvrhhnpe euleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefgkeenucfk phepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 2/5] hw/block/nvme: refactor zone resource management Date: Fri, 29 Jan 2021 10:15:38 +0100 Message-Id: <20210129091541.566330-3-its@irrelevant.dk> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129091541.566330-1-its@irrelevant.dk> References: <20210129091541.566330-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.29; envelope-from=its@irrelevant.dk; helo=out5-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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Zone transition handling and resource management is open coded (and semi-duplicated in the case of open, close and finish). In preparation for Simple Copy command support (which also needs to open zones for writing), consolidate into a set of 'nvme_zrm' functions and in the process fix a bug with the controller not closing an open zone to allow another zone to be explicitly opened. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/block/nvme.c | 220 +++++++++++++++++++++++------------------------- 1 file changed, 103 insertions(+), 117 deletions(-) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 79d9563a17bd..01d3801a3cd2 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1262,7 +1262,46 @@ static uint16_t nvme_check_zone_read(NvmeNamespace *= ns, uint64_t slba, return status; } =20 -static void nvme_auto_transition_zone(NvmeNamespace *ns) +static uint16_t nvme_zrm_finish(NvmeNamespace *ns, NvmeZone *zone) +{ + switch (nvme_get_zone_state(zone)) { + case NVME_ZONE_STATE_FULL: + return NVME_SUCCESS; + + case NVME_ZONE_STATE_IMPLICITLY_OPEN: + case NVME_ZONE_STATE_EXPLICITLY_OPEN: + nvme_aor_dec_open(ns); + /* fallthrough */ + case NVME_ZONE_STATE_CLOSED: + nvme_aor_dec_active(ns); + /* fallthrough */ + case NVME_ZONE_STATE_EMPTY: + nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_FULL); + return NVME_SUCCESS; + + default: + return NVME_ZONE_INVAL_TRANSITION; + } +} + +static uint16_t nvme_zrm_close(NvmeNamespace *ns, NvmeZone *zone) +{ + switch (nvme_get_zone_state(zone)) { + case NVME_ZONE_STATE_CLOSED: + return NVME_SUCCESS; + + case NVME_ZONE_STATE_EXPLICITLY_OPEN: + case NVME_ZONE_STATE_IMPLICITLY_OPEN: + nvme_aor_dec_open(ns); + nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_CLOSED); + /* fall through */ + + default: + return NVME_ZONE_INVAL_TRANSITION; + } +} + +static void nvme_zrm_auto_transition_zone(NvmeNamespace *ns) { NvmeZone *zone; =20 @@ -1274,34 +1313,74 @@ static void nvme_auto_transition_zone(NvmeNamespace= *ns) * Automatically close this implicitly open zone. */ QTAILQ_REMOVE(&ns->imp_open_zones, zone, entry); - nvme_aor_dec_open(ns); - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_CLOSED); + nvme_zrm_close(ns, zone); } } } =20 -static uint16_t nvme_auto_open_zone(NvmeNamespace *ns, NvmeZone *zone) +static uint16_t __nvme_zrm_open(NvmeNamespace *ns, NvmeZone *zone, + bool implicit) { - uint16_t status =3D NVME_SUCCESS; - uint8_t zs =3D nvme_get_zone_state(zone); + int act =3D 0; + uint16_t status; =20 - if (zs =3D=3D NVME_ZONE_STATE_EMPTY) { - nvme_auto_transition_zone(ns); - status =3D nvme_aor_check(ns, 1, 1); - } else if (zs =3D=3D NVME_ZONE_STATE_CLOSED) { - nvme_auto_transition_zone(ns); - status =3D nvme_aor_check(ns, 0, 1); + switch (nvme_get_zone_state(zone)) { + case NVME_ZONE_STATE_EMPTY: + act =3D 1; + + /* fallthrough */ + + case NVME_ZONE_STATE_CLOSED: + nvme_zrm_auto_transition_zone(ns); + status =3D nvme_aor_check(ns, act, 1); + if (status) { + return status; + } + + if (act) { + nvme_aor_inc_active(ns); + } + + nvme_aor_inc_open(ns); + + if (implicit) { + nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_IMPLICITLY_OP= EN); + return NVME_SUCCESS; + } + + /* fallthrough */ + + case NVME_ZONE_STATE_IMPLICITLY_OPEN: + if (implicit) { + return NVME_SUCCESS; + } + + nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_EXPLICITLY_OPEN); + + /* fallthrough */ + + case NVME_ZONE_STATE_EXPLICITLY_OPEN: + return NVME_SUCCESS; + + default: + return NVME_ZONE_INVAL_TRANSITION; } - - return status; } =20 -static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req, - bool failed) +static inline uint16_t nvme_zrm_auto(NvmeNamespace *ns, NvmeZone *zone) +{ + return __nvme_zrm_open(ns, zone, true); +} + +static inline uint16_t nvme_zrm_open(NvmeNamespace *ns, NvmeZone *zone) +{ + return __nvme_zrm_open(ns, zone, false); +} + +static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req) { NvmeRwCmd *rw =3D (NvmeRwCmd *)&req->cmd; NvmeZone *zone; - NvmeZonedResult *res =3D (NvmeZonedResult *)&req->cqe; uint64_t slba; uint32_t nlb; =20 @@ -1311,47 +1390,8 @@ static void nvme_finalize_zoned_write(NvmeNamespace = *ns, NvmeRequest *req, =20 zone->d.wp +=3D nlb; =20 - if (failed) { - res->slba =3D 0; - } - if (zone->d.wp =3D=3D nvme_zone_wr_boundary(zone)) { - switch (nvme_get_zone_state(zone)) { - case NVME_ZONE_STATE_IMPLICITLY_OPEN: - case NVME_ZONE_STATE_EXPLICITLY_OPEN: - nvme_aor_dec_open(ns); - /* fall through */ - case NVME_ZONE_STATE_CLOSED: - nvme_aor_dec_active(ns); - /* fall through */ - case NVME_ZONE_STATE_EMPTY: - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_FULL); - /* fall through */ - case NVME_ZONE_STATE_FULL: - break; - default: - assert(false); - } - } -} - -static void nvme_advance_zone_wp(NvmeNamespace *ns, NvmeZone *zone, - uint32_t nlb) -{ - uint8_t zs; - - zone->w_ptr +=3D nlb; - - if (zone->w_ptr < nvme_zone_wr_boundary(zone)) { - zs =3D nvme_get_zone_state(zone); - switch (zs) { - case NVME_ZONE_STATE_EMPTY: - nvme_aor_inc_active(ns); - /* fall through */ - case NVME_ZONE_STATE_CLOSED: - nvme_aor_inc_open(ns); - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_IMPLICITLY_OP= EN); - } + nvme_zrm_finish(ns, zone); } } =20 @@ -1376,7 +1416,7 @@ static void nvme_rw_cb(void *opaque, int ret) trace_pci_nvme_rw_cb(nvme_cid(req), blk_name(blk)); =20 if (ns->params.zoned && nvme_is_write(req)) { - nvme_finalize_zoned_write(ns, req, ret !=3D 0); + nvme_finalize_zoned_write(ns, req); } =20 if (!ret) { @@ -1752,12 +1792,12 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeRequ= est *req, bool append, goto invalid; } =20 - status =3D nvme_auto_open_zone(ns, zone); + status =3D nvme_zrm_auto(ns, zone); if (status) { goto invalid; } =20 - nvme_advance_zone_wp(ns, zone, nlb); + zone->w_ptr +=3D nlb; } =20 data_offset =3D nvme_l2b(ns, slba); @@ -1843,73 +1883,19 @@ enum NvmeZoneProcessingMask { static uint16_t nvme_open_zone(NvmeNamespace *ns, NvmeZone *zone, NvmeZoneState state, NvmeRequest *req) { - uint16_t status; - - switch (state) { - case NVME_ZONE_STATE_EMPTY: - status =3D nvme_aor_check(ns, 1, 0); - if (status) { - return status; - } - nvme_aor_inc_active(ns); - /* fall through */ - case NVME_ZONE_STATE_CLOSED: - status =3D nvme_aor_check(ns, 0, 1); - if (status) { - if (state =3D=3D NVME_ZONE_STATE_EMPTY) { - nvme_aor_dec_active(ns); - } - return status; - } - nvme_aor_inc_open(ns); - /* fall through */ - case NVME_ZONE_STATE_IMPLICITLY_OPEN: - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_EXPLICITLY_OPEN); - /* fall through */ - case NVME_ZONE_STATE_EXPLICITLY_OPEN: - return NVME_SUCCESS; - default: - return NVME_ZONE_INVAL_TRANSITION; - } + return nvme_zrm_open(ns, zone); } =20 static uint16_t nvme_close_zone(NvmeNamespace *ns, NvmeZone *zone, NvmeZoneState state, NvmeRequest *req) { - switch (state) { - case NVME_ZONE_STATE_EXPLICITLY_OPEN: - case NVME_ZONE_STATE_IMPLICITLY_OPEN: - nvme_aor_dec_open(ns); - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_CLOSED); - /* fall through */ - case NVME_ZONE_STATE_CLOSED: - return NVME_SUCCESS; - default: - return NVME_ZONE_INVAL_TRANSITION; - } + return nvme_zrm_close(ns, zone); } =20 static uint16_t nvme_finish_zone(NvmeNamespace *ns, NvmeZone *zone, NvmeZoneState state, NvmeRequest *req) { - switch (state) { - case NVME_ZONE_STATE_EXPLICITLY_OPEN: - case NVME_ZONE_STATE_IMPLICITLY_OPEN: - nvme_aor_dec_open(ns); - /* fall through */ - case NVME_ZONE_STATE_CLOSED: - nvme_aor_dec_active(ns); - /* fall through */ - case NVME_ZONE_STATE_EMPTY: - zone->w_ptr =3D nvme_zone_wr_boundary(zone); - zone->d.wp =3D zone->w_ptr; - nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_FULL); - /* fall through */ - case NVME_ZONE_STATE_FULL: - return NVME_SUCCESS; - default: - return NVME_ZONE_INVAL_TRANSITION; - } + return nvme_zrm_finish(ns, zone); } =20 static uint16_t nvme_reset_zone(NvmeNamespace *ns, NvmeZone *zone, --=20 2.30.0 From nobody Thu May 16 16:14:29 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 ARC-Seal: i=1; a=rsa-sha256; t=1611912034; cv=none; d=zohomail.com; s=zohoarc; b=Cw5jchDLonXgRpC+Axpvpsrbjc1AuqwQRzck+ZTJLJ33JQd1miMIbGcOdLVJ+umV8nFadORs2eHhv3p7Dan2x49HFF+jFWt5I43Rw/hi/ST/mjPMmK78itRDBhsAN4OMFMxED+U22juZCDsosK7iSkc0klU+RtYNa6QqMleLmy8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611912034; 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=QeqOkmn85NgxeaAB8t61RjJSup7bz7+mg7fgZj7T5AE=; b=AZA/G3DDQTSEbCKBJl7WyyYkwqE+Cp5nxZi59hpZfyR8rl+gA0f0m6pHkT1iwXCdbqwbVPMFS8XFLQBfBj+vS4GxDPFCQmwKwfF64P8KMuIm9H/EMI369CsHcJBXWodz46rZYipA6X5BKUvXNRle0wj4suNEG5V294FjdJRLBAg= 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 161191203391126.598267578127775; Fri, 29 Jan 2021 01:20:33 -0800 (PST) Received: from localhost ([::1]:42022 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5PxA-0008NH-6m for importer@patchew.org; Fri, 29 Jan 2021 04:20:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43222) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psg-0006Tf-MI; Fri, 29 Jan 2021 04:15:54 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:40803) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psc-0003dp-A6; Fri, 29 Jan 2021 04:15:54 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 875F55C01E4; Fri, 29 Jan 2021 04:15:49 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 29 Jan 2021 04:15:49 -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 3D4BA24005B; Fri, 29 Jan 2021 04:15:48 -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=fm2; bh=QeqOkmn85Ngxe aAB8t61RjJSup7bz7+mg7fgZj7T5AE=; b=knrPcMK3I3qSftCKJOWCqNgkcZF+L n/B9Z4nxF1grbwqu8CGdD4vwMiIzfy/BtQ/SrpvUkreq0z345w6qylycy1xVcrfz VyEN9+yfxSU6271WGIybVbNUWeWC8ovslgrtIhoEWxaBoA91racriFMLQrB3vsTz SghKbRKZX7pTQJhkUo5i24eASm9QW0dvo/CqR9ra50rMRmNOU2+JrrwpqHX1kryU lX9PvxrLQdWz3hzFJ6Tt3rPp/CB6ZdaxM1YXbI1FzsoBBYMUY5Nxi5AZA7dHsfeG KNjy86PxXjHfqwGzLy6eaCk6d2RrCKXdDNRHRiIu46ZLOaEjosMzw0vvA== 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=QeqOkmn85NgxeaAB8t61RjJSup7bz7+mg7fgZj7T5AE=; b=H5zWDPDf ALuUsa307rvVFIbiC1GcNZB2jxgULnWeiEpO6jxt5UKXEJdHAwzBlnpgcLVnBEBF jH14WRor3qGJQwQvvv34XH7pehcdcbDT4ddvHUCCG+epcy9wYTYy8AFYNvEsjGOI oz/QccnQDQUhkH9qnTvsIwLquORrb3zAD+vHHaBBu4ha8uTJy+etCZnnbRQnQOtx 3Fa298RDtpwP+9rpMZUU/SGyxtjHEXxF8Tn3p94oXDni8e73w5wa3sZIpSRcI4PM IIz1+EYSRNwU+4H6W53ca8m9WeAm5XeYH6MhHxbSOKJXeT53Cq2M5mx5UYKnTV7d 1ODLiIqhunAdLA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvucetufdoteggodetrfdotffvucfrrh hofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurh ephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhsucflvghn shgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtthgvrhhnpe euleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefgkeenucfk phepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 3/5] hw/block/nvme: pull write pointer advancement to separate function Date: Fri, 29 Jan 2021 10:15:39 +0100 Message-Id: <20210129091541.566330-4-its@irrelevant.dk> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129091541.566330-1-its@irrelevant.dk> References: <20210129091541.566330-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.29; envelope-from=its@irrelevant.dk; helo=out5-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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen In preparation for Simple Copy, pull write pointer advancement into a separate function that is independent on an NvmeRequest. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/block/nvme.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 01d3801a3cd2..6df285ecac03 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1377,6 +1377,16 @@ static inline uint16_t nvme_zrm_open(NvmeNamespace *= ns, NvmeZone *zone) return __nvme_zrm_open(ns, zone, false); } =20 +static void __nvme_advance_zone_wp(NvmeNamespace *ns, NvmeZone *zone, + uint32_t nlb) +{ + zone->d.wp +=3D nlb; + + if (zone->d.wp =3D=3D nvme_zone_wr_boundary(zone)) { + nvme_zrm_finish(ns, zone); + } +} + static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req) { NvmeRwCmd *rw =3D (NvmeRwCmd *)&req->cmd; @@ -1388,11 +1398,7 @@ static void nvme_finalize_zoned_write(NvmeNamespace = *ns, NvmeRequest *req) nlb =3D le16_to_cpu(rw->nlb) + 1; zone =3D nvme_get_zone_by_slba(ns, slba); =20 - zone->d.wp +=3D nlb; - - if (zone->d.wp =3D=3D nvme_zone_wr_boundary(zone)) { - nvme_zrm_finish(ns, zone); - } + __nvme_advance_zone_wp(ns, zone, nlb); } =20 static inline bool nvme_is_write(NvmeRequest *req) --=20 2.30.0 From nobody Thu May 16 16:14:29 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 ARC-Seal: i=1; a=rsa-sha256; t=1611912376; cv=none; d=zohomail.com; s=zohoarc; b=HNGEExeUE/5h6UnWEqD52VBfp5BwmOWDm7cIj9kXF718IzXi+m0Ji2l+eaa8Qrw5PEt3r45/98ykgaJiJuuj7zboMbrXpAYXvLI9wRh6lkbxh8tu8P/WTn6FoRBq4vs8vA7jE3OmCPju2qug1/n7qyQWX2ndEj9Qq8PrKZlRzBM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611912376; 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=c+LeO7/8pdWiyPjLgE3efXsKeJsrYDFeUSL8Ql5GOuI=; b=aoGBRFP09C8NPW1GLv6JdJq7Cup2adl3giojm8jhTZhbtjEpr9+2D8eA7p6bT9F66pU9c5f/upKMN5YAk0nFYgLuCbLWKmNvPwbksqksPOC+QBl9Uwqicb70khjkg9BVv+ORhgqDSxl3GfuCrVwbEx4fLksjJZAzHN2wIRyahXg= 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 161191237587826.261227394229763; Fri, 29 Jan 2021 01:26:15 -0800 (PST) Received: from localhost ([::1]:49918 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5Q2f-0003KZ-Gr for importer@patchew.org; Fri, 29 Jan 2021 04:26:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43246) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psk-0006UX-8P; Fri, 29 Jan 2021 04:15:58 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:59091) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Pse-0003eO-RE; Fri, 29 Jan 2021 04:15:58 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id EE4785C01E6; Fri, 29 Jan 2021 04:15:50 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 29 Jan 2021 04:15:50 -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 946D324005B; Fri, 29 Jan 2021 04:15:49 -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=fm2; bh=c+LeO7/8pdWiy PjLgE3efXsKeJsrYDFeUSL8Ql5GOuI=; b=n0rnHGYYpLQ6R3jYDgZrEBmS9L/1B t3CnXLginrQRQ4iWQiBTXHtCpuZOHkZ9TepJ+jB2u6AdVHwAcQsbppJ2ZkI0rpCI 7mEgEX8Q3chzMJdMIdpF6AyyNyn2fPBYP3h5i2dhgMfIsGYilhJlfDQj5njDfkg1 +A3Zj5I0lGHchpKrL/e0vG5F83/Bh/xwgJ4BsRT7aYmSG/5SddRqJo/UT4UIihmw 6iyfsC2N4bMts7Hz4dY70YNTG2wnG00NlxjGJ4Fp87Mbs4Y71KRc4vKg8zrITkto yny4I/u9Kow5vTALQYD0vwJIKyawkye3+hCTfZicWdunx62U7PjIW+pZQ== 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=c+LeO7/8pdWiyPjLgE3efXsKeJsrYDFeUSL8Ql5GOuI=; b=MElYca93 aRDgQ1EJzyk9YUA6zTffQheLBmCzclo6nst05woyvfYFy/NheY8PNhSsIxNp5ef5 MqxHbchEV7zi26NNOibwkqN7/CijqLhay+CJpF4AMEoovRvJOqQ+RFoNSFyjTsIu Km9Gp8/GwmJrCN2OBq4bkhhs7WD9zVU/KuIfQl0wzXa9KgHbWlQLMXxoN9XnUQEr 74ZgiUFxNwgu0Y3l5yJJyKdsrcMJ9lBx4+qPsZBOYqxeP9f17awz7Uz1Dzp5NnXH NbduzhI0CxvY1hFuuKtqJytXyPX2u3EJNrxhRPfIxrr5gST/RyZf9eeu2MfM30KU EnxW0jB24uv+Kg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvucetufdoteggodetrfdotffvucfrrh hofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurh ephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhsucflvghn shgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtthgvrhhnpe euleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefgkeenucfk phepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 4/5] nvme: updated shared header for copy command Date: Fri, 29 Jan 2021 10:15:40 +0100 Message-Id: <20210129091541.566330-5-its@irrelevant.dk> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129091541.566330-1-its@irrelevant.dk> References: <20210129091541.566330-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.29; envelope-from=its@irrelevant.dk; helo=out5-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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Minwoo Im , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add new data structures and types for the Simple Copy command. Signed-off-by: Klaus Jensen Reviewed-by: Minwoo Im Acked-by: Stefan Hajnoczi Reviewed-by: Keith Busch --- include/block/nvme.h | 45 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/include/block/nvme.h b/include/block/nvme.h index e4b918064df9..5977bcf0308a 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -579,6 +579,7 @@ enum NvmeIoCommands { NVME_CMD_COMPARE =3D 0x05, NVME_CMD_WRITE_ZEROES =3D 0x08, NVME_CMD_DSM =3D 0x09, + NVME_CMD_COPY =3D 0x19, NVME_CMD_ZONE_MGMT_SEND =3D 0x79, NVME_CMD_ZONE_MGMT_RECV =3D 0x7a, NVME_CMD_ZONE_APPEND =3D 0x7d, @@ -724,6 +725,35 @@ typedef struct QEMU_PACKED NvmeDsmRange { uint64_t slba; } NvmeDsmRange; =20 +enum { + NVME_COPY_FORMAT_0 =3D 0x0, +}; + +typedef struct NvmeCopyCmd { + uint8_t opcode; + uint8_t flags; + uint16_t cid; + uint32_t nsid; + uint32_t rsvd2[4]; + NvmeCmdDptr dptr; + uint64_t sdlba; + uint32_t cdw12; + uint32_t cdw13; + uint32_t ilbrt; + uint16_t lbat; + uint16_t lbatm; +} NvmeCopyCmd; + +typedef struct NvmeCopySourceRange { + uint8_t rsvd0[8]; + uint64_t slba; + uint16_t nlb; + uint8_t rsvd18[6]; + uint32_t eilbrt; + uint16_t elbat; + uint16_t elbatm; +} NvmeCopySourceRange; + enum NvmeAsyncEventRequest { NVME_AER_TYPE_ERROR =3D 0, NVME_AER_TYPE_SMART =3D 1, @@ -807,6 +837,7 @@ enum NvmeStatusCodes { NVME_CONFLICTING_ATTRS =3D 0x0180, NVME_INVALID_PROT_INFO =3D 0x0181, NVME_WRITE_TO_RO =3D 0x0182, + NVME_CMD_SIZE_LIMIT =3D 0x0183, NVME_ZONE_BOUNDARY_ERROR =3D 0x01b8, NVME_ZONE_FULL =3D 0x01b9, NVME_ZONE_READ_ONLY =3D 0x01ba, @@ -994,7 +1025,7 @@ typedef struct QEMU_PACKED NvmeIdCtrl { uint8_t nvscc; uint8_t rsvd531; uint16_t acwu; - uint8_t rsvd534[2]; + uint16_t ocfs; uint32_t sgls; uint8_t rsvd540[228]; uint8_t subnqn[256]; @@ -1022,6 +1053,11 @@ enum NvmeIdCtrlOncs { NVME_ONCS_FEATURES =3D 1 << 4, NVME_ONCS_RESRVATIONS =3D 1 << 5, NVME_ONCS_TIMESTAMP =3D 1 << 6, + NVME_ONCS_COPY =3D 1 << 8, +}; + +enum NvmeIdCtrlOcfs { + NVME_OCFS_COPY_FORMAT_0 =3D 1 << 0, }; =20 enum NvmeIdCtrlFrmw { @@ -1171,7 +1207,10 @@ typedef struct QEMU_PACKED NvmeIdNs { uint16_t npdg; uint16_t npda; uint16_t nows; - uint8_t rsvd74[30]; + uint16_t mssrl; + uint32_t mcl; + uint8_t msrc; + uint8_t rsvd81[23]; uint8_t nguid[16]; uint64_t eui64; NvmeLBAF lbaf[16]; @@ -1323,6 +1362,7 @@ static inline void _nvme_check_size(void) QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) !=3D 8); QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) !=3D 16); QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) !=3D 16); + QEMU_BUILD_BUG_ON(sizeof(NvmeCopySourceRange) !=3D 32); QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeDeleteQ) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeCreateCq) !=3D 64); @@ -1330,6 +1370,7 @@ static inline void _nvme_check_size(void) QEMU_BUILD_BUG_ON(sizeof(NvmeIdentify) !=3D 64); 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(NvmeRangeType) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeErrorLog) !=3D 64); QEMU_BUILD_BUG_ON(sizeof(NvmeFwSlotInfoLog) !=3D 512); --=20 2.30.0 From nobody Thu May 16 16:14:29 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 ARC-Seal: i=1; a=rsa-sha256; t=1611912778; cv=none; d=zohomail.com; s=zohoarc; b=FQZBmcZpPYBbs6X5QvZZOhzvQd4awbsf36PYMAogaumP6g9hsg6ZZ90SRoisPObVW4fdhHYsWnJgaSxU1XogoCGnfptgs0gvETLElA6PwGUlwRA510O9QkWMH0vMGKDhrAq4cA7ONMdzBiQ5cuCMQV+QoY8FDuYiVSvrU3vHd1c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611912778; 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=0flBLSbbMlXNn/wOwiwAWAtV4FBWIQsKzH4mRReHeLs=; b=XZmWXl5O5SkCwhpTB9+oqTDLXIEPvrUFEhVHerGTbhQ85fQVyxmRKGIcWCIk7E8YItxWub3girj9sQcBL9atdIbEfpf3R8/WSxBY5OZxGhacQvSEvRlqqRHpntvUb2tB1TUyUK8HsoE8pfpkHCeiL8ZdsRuBcZ4QpdHGshN51hk= 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 1611912778364986.7114657373755; Fri, 29 Jan 2021 01:32:58 -0800 (PST) Received: from localhost ([::1]:59944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5Q99-0007UG-0e for importer@patchew.org; Fri, 29 Jan 2021 04:32:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43268) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psn-0006Wu-BW; Fri, 29 Jan 2021 04:16:01 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:55225) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5Psf-0003fG-IK; Fri, 29 Jan 2021 04:16:00 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 576D45C01F1; Fri, 29 Jan 2021 04:15:52 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Fri, 29 Jan 2021 04:15:52 -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 0FD1E24005A; Fri, 29 Jan 2021 04:15:50 -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=fm2; bh=0flBLSbbMlXNn /wOwiwAWAtV4FBWIQsKzH4mRReHeLs=; b=jotu81Bew59Oajercwn/36ciLAJIk cLj82y1XQups0hiUvDYSxuRH9GHS+BoZKUrWgHtlpdvClQxut9lJlDWrGGJkQpVh f0umNEqk2Wtp46fm2QL887MdJOTgwmWM647s0Wz2fbnulXDDwHJR9wkjH1BawJAG Ytz7n+ZwTQAQpvQ2dLQrOmgNj7qFMW2NaDfjoECyfvA3AYbCl90PeLMcnU1KZMHo Cu9Dfb5qgWhdNEHPPP8VCNeHsdhSo/p62CZjKl6UH521aykw7vcIvYVeg8GhmCBg P4IkNk/Ugu2y8jEL3Hf9tDT8/h37xrvD/5KycqlFEtaHe/CDZ5p0PLlEQ== 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=0flBLSbbMlXNn/wOwiwAWAtV4FBWIQsKzH4mRReHeLs=; b=HSWLgUfu eZxa5yrAXTYUOjWwyOj6npUotV8Zop6HtCYqplsEHfZGiC9xEhPZhgKllitblYEf 5uOWAS4DVXxYUltgnwUzKzW1ofX1Q4tu1BSUt9BQXPZqKfPYpYLHPdZpcTaTUKVU +zIMn7wJvp6EtsFYw/QDIIEn0Wypi6tcL0qutOOP3GIyxdHGMUJs1Ap/ZUTFiEzZ PgFJagtoWgtUu8LPLGP0z6exIdEx6C4Y1Ol30P2a6N7PqriQmncS8nIt3hdNv2+5 /mCKsQ6eiWE4KhJUm34RtFj3zIpDRf1qgaYN307NWFI0PFvBofELZ9msyxYHMek5 6+i2yOMkTVaQYA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvucetufdoteggodetrfdotffvucfrrh hofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurh ephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhsucflvghn shgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtthgvrhhnpe euleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefgkeenucfk phepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpeefnecurfgrrh grmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 5/5] hw/block/nvme: add simple copy command Date: Fri, 29 Jan 2021 10:15:41 +0100 Message-Id: <20210129091541.566330-6-its@irrelevant.dk> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129091541.566330-1-its@irrelevant.dk> References: <20210129091541.566330-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.29; envelope-from=its@irrelevant.dk; helo=out5-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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add support for TP 4065a ("Simple Copy Command"), v2020.05.04 ("Ratified"). The implementation uses a bounce buffer to first read in the source logical blocks, then issue a write of that bounce buffer. The default maximum number of source logical blocks is 128, translating to 512 KiB for 4k logical blocks which aligns with the default value of MDTS. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/block/nvme-ns.h | 4 + hw/block/nvme.h | 1 + hw/block/nvme-ns.c | 8 ++ hw/block/nvme.c | 253 +++++++++++++++++++++++++++++++++++++++++- hw/block/trace-events | 7 ++ 5 files changed, 272 insertions(+), 1 deletion(-) diff --git a/hw/block/nvme-ns.h b/hw/block/nvme-ns.h index 293ac990e3f6..6ba7ae7ced9c 100644 --- a/hw/block/nvme-ns.h +++ b/hw/block/nvme-ns.h @@ -29,6 +29,10 @@ typedef struct NvmeNamespaceParams { uint32_t nsid; QemuUUID uuid; =20 + uint16_t mssrl; + uint32_t mcl; + uint8_t msrc; + bool zoned; bool cross_zone_read; uint64_t zone_size_bs; diff --git a/hw/block/nvme.h b/hw/block/nvme.h index dee6092bd45f..407c7b3fbe91 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -68,6 +68,7 @@ static inline const char *nvme_io_opc_str(uint8_t opc) case NVME_CMD_COMPARE: return "NVME_NVM_CMD_COMPARE"; 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_SEND: return "NVME_ZONED_CMD_MGMT_SEND"; case NVME_CMD_ZONE_MGMT_RECV: return "NVME_ZONED_CMD_MGMT_RECV"; case NVME_CMD_ZONE_APPEND: return "NVME_ZONED_CMD_ZONE_APPEND"; diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index 62b25cf69bfa..69ac62752347 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -63,6 +63,11 @@ static int nvme_ns_init(NvmeNamespace *ns, Error **errp) =20 id_ns->npda =3D id_ns->npdg =3D npdg - 1; =20 + /* simple copy */ + id_ns->mssrl =3D cpu_to_le16(ns->params.mssrl); + id_ns->mcl =3D cpu_to_le32(ns->params.mcl); + id_ns->msrc =3D ns->params.msrc; + return 0; } =20 @@ -377,6 +382,9 @@ static Property nvme_ns_props[] =3D { DEFINE_BLOCK_PROPERTIES(NvmeNamespace, blkconf), DEFINE_PROP_UINT32("nsid", NvmeNamespace, params.nsid, 0), DEFINE_PROP_UUID("uuid", NvmeNamespace, params.uuid), + DEFINE_PROP_UINT16("mssrl", NvmeNamespace, params.mssrl, 128), + DEFINE_PROP_UINT32("mcl", NvmeNamespace, params.mcl, 128), + DEFINE_PROP_UINT8("msrc", NvmeNamespace, params.msrc, 127), DEFINE_PROP_BOOL("zoned", NvmeNamespace, params.zoned, false), DEFINE_PROP_SIZE("zoned.zone_size", NvmeNamespace, params.zone_size_bs, NVME_DEFAULT_ZONE_SIZE), diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 6df285ecac03..08b63c85f4cf 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -167,6 +167,7 @@ static const uint32_t nvme_cse_iocs_nvm[256] =3D { [NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP, [NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, + [NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP, }; =20 @@ -176,6 +177,7 @@ static const uint32_t nvme_cse_iocs_zoned[256] =3D { [NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP, [NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, + [NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP, [NVME_CMD_ZONE_APPEND] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_CMD_ZONE_MGMT_SEND] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, @@ -1502,6 +1504,136 @@ static void nvme_aio_zone_reset_cb(void *opaque, in= t ret) nvme_enqueue_req_completion(nvme_cq(req), req); } =20 +struct nvme_copy_ctx { + int copies; + uint8_t *bounce; + uint32_t nlb; +}; + +struct nvme_copy_in_ctx { + NvmeRequest *req; + QEMUIOVector iov; +}; + +static void nvme_copy_cb(void *opaque, int ret) +{ + NvmeRequest *req =3D opaque; + NvmeNamespace *ns =3D req->ns; + struct nvme_copy_ctx *ctx =3D req->opaque; + + trace_pci_nvme_copy_cb(nvme_cid(req)); + + if (ns->params.zoned) { + NvmeCopyCmd *copy =3D (NvmeCopyCmd *)&req->cmd; + uint64_t sdlba =3D le64_to_cpu(copy->sdlba); + NvmeZone *zone =3D nvme_get_zone_by_slba(ns, sdlba); + + __nvme_advance_zone_wp(ns, zone, ctx->nlb); + } + + if (!ret) { + block_acct_done(blk_get_stats(ns->blkconf.blk), &req->acct); + } else { + block_acct_failed(blk_get_stats(ns->blkconf.blk), &req->acct); + nvme_aio_err(req, ret); + } + + g_free(ctx->bounce); + g_free(ctx); + + nvme_enqueue_req_completion(nvme_cq(req), req); +} + +static void nvme_copy_in_complete(NvmeRequest *req) +{ + NvmeNamespace *ns =3D req->ns; + NvmeCopyCmd *copy =3D (NvmeCopyCmd *)&req->cmd; + struct nvme_copy_ctx *ctx =3D req->opaque; + uint64_t sdlba =3D le64_to_cpu(copy->sdlba); + uint16_t status; + + trace_pci_nvme_copy_in_complete(nvme_cid(req)); + + block_acct_done(blk_get_stats(ns->blkconf.blk), &req->acct); + + status =3D nvme_check_bounds(ns, sdlba, ctx->nlb); + if (status) { + trace_pci_nvme_err_invalid_lba_range(sdlba, ctx->nlb, ns->id_ns.ns= ze); + goto invalid; + } + + if (ns->params.zoned) { + NvmeZone *zone =3D nvme_get_zone_by_slba(ns, sdlba); + + status =3D nvme_check_zone_write(ns, zone, sdlba, ctx->nlb); + if (status) { + goto invalid; + } + + status =3D nvme_zrm_auto(ns, zone); + if (status) { + goto invalid; + } + + zone->w_ptr +=3D ctx->nlb; + } + + qemu_iovec_init(&req->iov, 1); + qemu_iovec_add(&req->iov, ctx->bounce, nvme_l2b(ns, ctx->nlb)); + + block_acct_start(blk_get_stats(ns->blkconf.blk), &req->acct, + nvme_l2b(ns, ctx->nlb), BLOCK_ACCT_WRITE); + + req->aiocb =3D blk_aio_pwritev(ns->blkconf.blk, nvme_l2b(ns, sdlba), + &req->iov, 0, nvme_copy_cb, req); + + return; + +invalid: + req->status =3D status; + + g_free(ctx->bounce); + g_free(ctx); + + nvme_enqueue_req_completion(nvme_cq(req), req); +} + +static void nvme_aio_copy_in_cb(void *opaque, int ret) +{ + struct nvme_copy_in_ctx *in_ctx =3D opaque; + NvmeRequest *req =3D in_ctx->req; + NvmeNamespace *ns =3D req->ns; + struct nvme_copy_ctx *ctx =3D req->opaque; + + qemu_iovec_destroy(&in_ctx->iov); + g_free(in_ctx); + + trace_pci_nvme_aio_copy_in_cb(nvme_cid(req)); + + if (ret) { + nvme_aio_err(req, ret); + } + + ctx->copies--; + + if (ctx->copies) { + return; + } + + if (req->status) { + block_acct_failed(blk_get_stats(ns->blkconf.blk), &req->acct); + + g_free(ctx->bounce); + g_free(ctx); + + nvme_enqueue_req_completion(nvme_cq(req), req); + + return; + } + + nvme_copy_in_complete(req); +} + struct nvme_compare_ctx { QEMUIOVector iov; uint8_t *bounce; @@ -1620,6 +1752,122 @@ static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *= req) return status; } =20 +static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req) +{ + NvmeNamespace *ns =3D req->ns; + NvmeCopyCmd *copy =3D (NvmeCopyCmd *)&req->cmd; + g_autofree NvmeCopySourceRange *range =3D NULL; + + uint32_t cdw12 =3D le32_to_cpu(copy->cdw12); + uint16_t nr =3D (cdw12 & 0xff) + 1; + uint8_t format =3D (cdw12 >> 8) & 0xf; + uint32_t nlb =3D 0; + + uint8_t *bounce =3D NULL, *bouncep =3D NULL; + struct nvme_copy_ctx *ctx; + uint16_t status; + int i; + + trace_pci_nvme_copy(nvme_cid(req), nvme_nsid(ns), nr, format); + + if (!(n->id_ctrl.ocfs & (1 << format))) { + trace_pci_nvme_err_copy_invalid_format(format); + return NVME_INVALID_FIELD | NVME_DNR; + } + + if (nr > ns->id_ns.msrc + 1) { + return NVME_CMD_SIZE_LIMIT | NVME_DNR; + } + + range =3D g_new(NvmeCopySourceRange, nr); + + status =3D nvme_dma(n, (uint8_t *)range, nr * sizeof(NvmeCopySourceRan= ge), + DMA_DIRECTION_TO_DEVICE, req); + if (status) { + return status; + } + + for (i =3D 0; i < nr; i++) { + uint64_t slba =3D le64_to_cpu(range[i].slba); + uint32_t _nlb =3D le16_to_cpu(range[i].nlb) + 1; + + if (_nlb > le16_to_cpu(ns->id_ns.mssrl)) { + return NVME_CMD_SIZE_LIMIT | NVME_DNR; + } + + status =3D nvme_check_bounds(ns, slba, _nlb); + if (status) { + trace_pci_nvme_err_invalid_lba_range(slba, _nlb, ns->id_ns.nsz= e); + return status; + } + + if (NVME_ERR_REC_DULBE(ns->features.err_rec)) { + status =3D nvme_check_dulbe(ns, slba, _nlb); + if (status) { + return status; + } + } + + if (ns->params.zoned) { + status =3D nvme_check_zone_read(ns, slba, _nlb); + if (status) { + return status; + } + } + + nlb +=3D _nlb; + } + + if (nlb > le32_to_cpu(ns->id_ns.mcl)) { + return NVME_CMD_SIZE_LIMIT | NVME_DNR; + } + + bounce =3D bouncep =3D g_malloc(nvme_l2b(ns, nlb)); + + block_acct_start(blk_get_stats(ns->blkconf.blk), &req->acct, + nvme_l2b(ns, nlb), BLOCK_ACCT_READ); + + ctx =3D g_new(struct nvme_copy_ctx, 1); + + ctx->bounce =3D bounce; + ctx->nlb =3D nlb; + ctx->copies =3D 1; + + req->opaque =3D ctx; + + for (i =3D 0; i < nr; i++) { + uint64_t slba =3D le64_to_cpu(range[i].slba); + uint32_t nlb =3D le16_to_cpu(range[i].nlb) + 1; + + size_t len =3D nvme_l2b(ns, nlb); + int64_t offset =3D nvme_l2b(ns, slba); + + trace_pci_nvme_copy_source_range(slba, nlb); + + struct nvme_copy_in_ctx *in_ctx =3D g_new(struct nvme_copy_in_ctx,= 1); + in_ctx->req =3D req; + + qemu_iovec_init(&in_ctx->iov, 1); + qemu_iovec_add(&in_ctx->iov, bouncep, len); + + ctx->copies++; + + blk_aio_preadv(ns->blkconf.blk, offset, &in_ctx->iov, 0, + nvme_aio_copy_in_cb, in_ctx); + + bouncep +=3D len; + } + + /* account for the 1-initialization */ + ctx->copies--; + + if (!ctx->copies) { + nvme_copy_in_complete(req); + } + + return NVME_NO_COMPLETE; +} + static uint16_t nvme_compare(NvmeCtrl *n, NvmeRequest *req) { NvmeRwCmd *rw =3D (NvmeRwCmd *)&req->cmd; @@ -2357,6 +2605,8 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest = *req) return nvme_compare(n, req); case NVME_CMD_DSM: return nvme_dsm(n, req); + case NVME_CMD_COPY: + return nvme_copy(n, req); case NVME_CMD_ZONE_MGMT_SEND: return nvme_zone_mgmt_send(n, req); case NVME_CMD_ZONE_MGMT_RECV: @@ -4436,9 +4686,10 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *p= ci_dev) id->nn =3D cpu_to_le32(n->num_namespaces); id->oncs =3D cpu_to_le16(NVME_ONCS_WRITE_ZEROES | NVME_ONCS_TIMESTAMP | NVME_ONCS_FEATURES | NVME_ONCS_DSM | - NVME_ONCS_COMPARE); + NVME_ONCS_COMPARE | NVME_ONCS_COPY); =20 id->vwc =3D (0x2 << 1) | 0x1; + id->ocfs =3D cpu_to_le16(NVME_OCFS_COPY_FORMAT_0); id->sgls =3D cpu_to_le32(NVME_CTRL_SGLS_SUPPORT_NO_ALIGN | NVME_CTRL_SGLS_BITBUCKET); =20 diff --git a/hw/block/trace-events b/hw/block/trace-events index c083000b8c1f..b26866ba4338 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -43,12 +43,18 @@ pci_nvme_admin_cmd(uint16_t cid, uint16_t sqid, uint8_t= opcode, const char *opna pci_nvme_read(uint16_t cid, uint32_t nsid, uint32_t nlb, uint64_t count, u= int64_t lba) "cid %"PRIu16" nsid %"PRIu32" nlb %"PRIu32" count %"PRIu64" lb= a 0x%"PRIx64"" pci_nvme_write(uint16_t cid, const char *verb, uint32_t nsid, uint32_t nlb= , uint64_t count, uint64_t lba) "cid %"PRIu16" opname '%s' nsid %"PRIu32" n= lb %"PRIu32" count %"PRIu64" lba 0x%"PRIx64"" pci_nvme_rw_cb(uint16_t cid, const char *blkname) "cid %"PRIu16" blk '%s'" +pci_nvme_copy(uint16_t cid, uint32_t nsid, uint16_t nr, uint8_t format) "c= id %"PRIu16" nsid %"PRIu32" nr %"PRIu16" format 0x%"PRIx8"" +pci_nvme_copy_source_range(uint64_t slba, uint32_t nlb) "slba 0x%"PRIx64" = nlb %"PRIu32"" +pci_nvme_copy_in_complete(uint16_t cid) "cid %"PRIu16"" +pci_nvme_copy_cb(uint16_t cid) "cid %"PRIu16"" +pci_nvme_write_zeroes(uint16_t cid, uint32_t nsid, uint64_t slba, uint32_t= nlb) "cid %"PRIu16" nsid %"PRIu32" slba %"PRIu64" nlb %"PRIu32"" pci_nvme_block_status(int64_t offset, int64_t bytes, int64_t pnum, int ret= , bool zeroed) "offset %"PRId64" bytes %"PRId64" pnum %"PRId64" ret 0x%x ze= roed %d" pci_nvme_dsm(uint16_t cid, uint32_t nsid, uint32_t nr, uint32_t attr) "cid= %"PRIu16" nsid %"PRIu32" nr %"PRIu32" attr 0x%"PRIx32"" pci_nvme_dsm_deallocate(uint16_t cid, uint32_t nsid, uint64_t slba, uint32= _t nlb) "cid %"PRIu16" nsid %"PRIu32" slba %"PRIu64" nlb %"PRIu32"" pci_nvme_compare(uint16_t cid, uint32_t nsid, uint64_t slba, uint32_t nlb)= "cid %"PRIu16" nsid %"PRIu32" slba 0x%"PRIx64" nlb %"PRIu32"" 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_aio_zone_reset_cb(uint16_t cid, uint64_t zslba) "cid %"PRIu16" zs= lba 0x%"PRIx64"" 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" @@ -113,6 +119,7 @@ pci_nvme_err_addr_read(uint64_t addr) "addr 0x%"PRIx64"" pci_nvme_err_addr_write(uint64_t addr) "addr 0x%"PRIx64"" pci_nvme_err_cfs(void) "controller fatal status" pci_nvme_err_aio(uint16_t cid, const char *errname, uint16_t status) "cid = %"PRIu16" err '%s' status 0x%"PRIx16"" +pci_nvme_err_copy_invalid_format(uint8_t format) "format 0x%"PRIx8"" pci_nvme_err_invalid_sgld(uint16_t cid, uint8_t typ) "cid %"PRIu16" type 0= x%"PRIx8"" pci_nvme_err_invalid_num_sgld(uint16_t cid, uint8_t typ) "cid %"PRIu16" ty= pe 0x%"PRIx8"" pci_nvme_err_invalid_sgl_excess_length(uint16_t cid) "cid %"PRIu16"" --=20 2.30.0