From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C36A723F41F for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; cv=none; b=OxO98FIc1kSsiTaJ1eyQVhpoBtlq89u4TvQ0URu96AnN2tg6pJo3A1olYHH+Q7j4U6qZc7rC7bcGXcp/akRIz48ii6ctyK1oIrfWqzoH18xbo/9lTns1g5IfGINQ2xue1IV0lbUjlLDEsECBowVfnAWkuhNonEjk3gUFyHzKVmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; c=relaxed/simple; bh=lwmTomBWKE8Fd16/Zh2Qe9kwiZVyEXAqd8HpaGKIrfI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NTeYxEdJhxxWubmMbiwSeEEzUN9ppChvtHK5yPhrhau92UwlaZiKoqoy9XiU7OH9A9SNe8W07igeSFAykgw9i/AE5kq6PiAMxFnwqhySDvRDcIR/tEnSVP7mOpSnlcJ8pPAlJgyc7BhP4M2nLGtLnXcKNWY0MmPL0sKVBI6nQis= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=swVGvptS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="swVGvptS" Received: by smtp.kernel.org (Postfix) with ESMTPS id 879C7C4CEF6; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=lwmTomBWKE8Fd16/Zh2Qe9kwiZVyEXAqd8HpaGKIrfI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=swVGvptSMFOOMV7ImHmIDyFFsT4ndQ7Wqvjwdef0i6+fc/wA7WIPwrFtdTvrFDRiY eh4IcRJacu1vaEK9WnuFsTiwvuUK56aQoEyfPrM+5/ORkMKK0Uzy/KcihfjMpEA50n AZklIAZEkZlzrTvWq9K332w1Lb0hcS8LLczji0Kiv/Gok3NbMnpgw17XoXR6AyCxgr oAKq3g1wcoQCY6Soz0mr8XSHzzSZOGNaZToorUyB8KoNo0eEaPrRyUQadkJgHaJo/p wJ08I2G1L0humcq1aNs6C/FQSh8hcBDE2LWu/9ApQS+KR8ttMl2lqE1MD1T7ljbeNG JBByCqvQK5O7w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 777E9C83F1A; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:32 +0200 Subject: [PATCH RFC 1/8] nvme: Add CDQ command definitions for contiguous PRPs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-1-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2698; i=joel.granados@kernel.org; h=from:subject:message-id; bh=lwmTomBWKE8Fd16/Zh2Qe9kwiZVyEXAqd8HpaGKIrfI=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yuk8GfwoY75hez1nZj0kKr5XnWOHgbukI 9JpgO6uZi0vqokBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrpAAoJELqXzVK3 lkFPbggL/3XB2pAsjL3sKHaEN/oXQH2adusVp/KPNpHVTF6HFzd8CNfdj8yM0/08oL9Zv0CCvx0 JyeBNW/uugwDdleya/LpBmpLQL5IM5j185NcqpPUHp+TbIPSjKvnk56/O6hn8zccX4MAI5GaoGz Xv/XQ67UlpIbz1OJ4kfCypoCfmtCwSMVOOn1+2kQ3HWKUgm32uamuDFonh2H2Jiq4OQUhzYptle Sb4psXJpbiOyW/Ubk58PiKB9SqSFIfUh7km3M8S936ElBCFXh8YqvkiT19V533XUTolsEKHifRB vLN8bB79Aqd6xywdFp2s2JA7q75tuEcaFGGSmKRTY5ucfEbDl8XzICgaulHcX8lpb4DinIyyi4a IxmmJ7tB0c1bEiACjIr+AJRir3tkw8sAEE+QUoahlGSx/6QrRxzp+ImSyhlUDGnv19ksqEDZdmu R8BP5p0GcMT42vWg+T7HWD+kwu0pWX7Fg+Qz8KbS9SZWMwi353Wo4ESMoTAOjhCYtE6sf7jiNN7 K4= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Add nvme_cdq to the nvme_command union that handles creation and deletion operations. NVME_FEAT_CDQ is added to the feature flags with a value of 0x21. nvme_admin_cdq is added to the NVME opcodes with a value of 0x45. Add support for contiguous PRPs only; the non-contiguous case described in the NVME spec can be added later. Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 1 + include/linux/nvme.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 6b04473c0ab73c61e208bb8fc230c2f9b65c69bc..7be6b42a1adcc3fdb3cec2e2d0e= 73fcf74244590 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -5133,6 +5133,7 @@ static inline void _nvme_check_size(void) BUILD_BUG_ON(sizeof(struct nvme_rotational_media_log) !=3D 512); BUILD_BUG_ON(sizeof(struct nvme_dbbuf) !=3D 64); BUILD_BUG_ON(sizeof(struct nvme_directive_cmd) !=3D 64); + BUILD_BUG_ON(sizeof(struct nvme_cdq) !=3D 64); BUILD_BUG_ON(sizeof(struct nvme_feat_host_behavior) !=3D 512); } =20 diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 2479ed10f53e37055973ea3c899060913923fa62..a2012ec00e60c2f0de1b06599ba= 39481eebe4263 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -1240,6 +1240,7 @@ enum nvme_admin_opcode { nvme_admin_virtual_mgmt =3D 0x1c, nvme_admin_nvme_mi_send =3D 0x1d, nvme_admin_nvme_mi_recv =3D 0x1e, + nvme_admin_cdq =3D 0x45, nvme_admin_dbbuf =3D 0x7C, nvme_admin_format_nvm =3D 0x80, nvme_admin_security_send =3D 0x81, @@ -1309,6 +1310,7 @@ enum { NVME_FEAT_PLM_WINDOW =3D 0x14, NVME_FEAT_HOST_BEHAVIOR =3D 0x16, NVME_FEAT_SANITIZE =3D 0x17, + NVME_FEAT_CDQ =3D 0x21, NVME_FEAT_SW_PROGRESS =3D 0x80, NVME_FEAT_HOST_ID =3D 0x81, NVME_FEAT_RESV_MASK =3D 0x82, @@ -1514,6 +1516,33 @@ struct nvme_directive_cmd { __u32 rsvd16[3]; }; =20 +struct nvme_cdq { + __u8 opcode; + __u8 flags; + __u16 command_id; + __u32 rsvd1[5]; + __le64 prp1; + __u32 rsvd8[2]; +#define NVME_CDQ_SEL_CREATE_CDQ 0x0 +#define NVME_CDQ_SEL_DELETE_CDQ 0x1 + __u8 sel; + __u8 rsvd10; + __le16 mos; + union { + struct { +#define NVME_CDQ_CFG_PC_CONT (1 << 0) + __le16 cdq_flags; + __le16 cqs; + } create; + struct { + __le16 cdqid; + __le16 rsvd; + } delete; + }; + __le32 cdqsize; + __u32 rsvd13[2]; +}; + /* * Fabrics subcommands. */ @@ -1923,6 +1952,7 @@ struct nvme_command { struct nvmf_auth_receive_command auth_receive; struct nvme_dbbuf dbbuf; struct nvme_directive_cmd directive; + struct nvme_cdq cdq; }; }; =20 --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C35E123E324 for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; cv=none; b=YEPTdwpC/0YqSqR+XWOvjruZ1YA7C2jxNNjPZKNc13jgXk1fgjljoQ9TIOe5reHIRKQ/6A5K3Ko7owhD3TKxsYEwzLYZNtKhIj4aememBAzE8NdZ5ld6SQ6d35HyPP4BHu8QRo+Dyww2VfVYuZu3b8Rjsy6jH5zHzn6XoTUYsLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; c=relaxed/simple; bh=eL+MfX1V8Mfw/6f5jaBeMGhJRWRE2FDY6L9HT7HNVLw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yk933ynru8HtJqqRCfyMNs+Vk1fLru5gwXXCQlffK+iO/XkhlLZZl1dmB414RBEsSD/ZU0KT/Zd1x1LWRDElayjbdz5cxH+mPgND0G133a6Cz124MXIb7bNi8yVf1IcwtR646ppkK6JzQ6HhTcE1IPi4xqu5VCKc2tmOAcjhaOM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EJ85yz67; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EJ85yz67" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9429AC4CEF7; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=eL+MfX1V8Mfw/6f5jaBeMGhJRWRE2FDY6L9HT7HNVLw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EJ85yz67JLGW+HGrj1fWSm0xWy3RJcRBmgV0lUJFahMINScGwG9xbjPuYldBogX8t s+BaeSlDa8asLxuuAKCzLg5IYq6ypJLi60kojDujO7czMPfV+g8ExbozqTGrxSS7W1 me0JA6efSmq1NWapSOVEdVk4Zn3h5AJXr02HdXrFPU73HRFg2nziLjssCK7Biv9I8T O9Gu+Oj2WnXD9ZLri63QE+DegpgoayHsrehvrKa2jU5/Yr2uHQlcRa1zxUNxBGPfZ6 xO376l3j6l36oAHj5Zl+Ubfli0giJenq+aBAkaQdvTM37zuhwQuQkjr9+CcIl7zq8h WrMv7SkfwvUaA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87961C83F25; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:33 +0200 Subject: [PATCH RFC 2/8] nvme: Add cdq data structure to nvme_ctrl Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-2-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2081; i=joel.granados@kernel.org; h=from:subject:message-id; bh=eL+MfX1V8Mfw/6f5jaBeMGhJRWRE2FDY6L9HT7HNVLw=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yuoiMgo9kvgQ2onuXE5Bzm5EOPldHUWSc djDt0GXzv++i4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrqAAoJELqXzVK3 lkFP7x8L/RbyrP9gWDYhZxH9l/ZFBQRLh1tU1lEpjnC+0l19BplIU233ls4Nb8jufwEnNM7UXmN f34Xd5pqD5X40TutgIT8NCx6ZAplYlm9cvfQN3nfMhJrOXNGFWrDh0SkoKAEikhlRDdbVJndHWF mppIYEWpeOoeJ1zPkyAx1tZE6luI6kkewQQVx9rCcRZyWd3oIceHT9EGPHsbOcJmXPUbtZrLE+h QXZUiib2GpEy7fV+FC6SjUCmbGlF8uX6lb6S1FkEX5qwYJc+1tk6THS4WelQDLvzcMOz2Bd8agG GCUVM2syC+eJ90IExrl4TOnJvouuzVBVY15ZnouJAs+PoQoIYSuC/RprqqbEer9SILxB5rQ/N0e rMlK4zTRYFWu4HJuptuMg8TMhkFJckLIA17dcGvxHgi8dTWm7AMlCbrKBAteyvQWPasB5nsUi/K 4hHwBLWURwHEQuJLDr9OTSGPBX6b7QcLUnvujeCj42X5ZJ/+a4HfF2MswcEi9uLEQkmzqe8+rI5 Jo= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Add a CDQ xarray to nvme_ctrl allowing for several CDQs per controller (as per specification). The structure will house a pointer to its controller (*ctrl), a pointer to the entry memory (*entries), number and size of entries, current entry and phase bit value, the location of the phase bit value within an entry, dma address, CDQ id and the file pointer where the reading will be taking place. Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 1 + drivers/nvme/host/nvme.h | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 7be6b42a1adcc3fdb3cec2e2d0e73fcf74244590..9b2de74d62f7a65aea2d28bbbed= 6681195d9afcd 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -4868,6 +4868,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct dev= ice *dev, mutex_init(&ctrl->scan_lock); INIT_LIST_HEAD(&ctrl->namespaces); xa_init(&ctrl->cels); + xa_init(&ctrl->cdqs); ctrl->dev =3D dev; ctrl->ops =3D ops; ctrl->quirks =3D quirks; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 8fc4683418a3a6929311c7b56da90ebcbbe16d86..800970a0bb87f7a3b6e855f56a2= 493a7deed1ecd 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -411,6 +411,7 @@ struct nvme_ctrl { enum nvme_ctrl_type cntrltype; enum nvme_dctype dctype; u16 awupf; /* 0's based value. */ + struct xarray cdqs; /* Controller Data Queue */ }; =20 static inline enum nvme_ctrl_state nvme_ctrl_state(struct nvme_ctrl *ctrl) @@ -553,6 +554,20 @@ static inline bool nvme_ns_has_pi(struct nvme_ns_head = *head) return head->pi_type && head->ms =3D=3D head->pi_size; } =20 +struct cdq_nvme_queue { + struct nvme_ctrl *ctrl; + void *entries; + u32 entry_nbyte; + u32 entry_nr; + u32 curr_entry; + u8 curr_cdqp; + uint cdqp_offset; + uint cdqp_mask; + dma_addr_t entries_dma_addr; + u16 cdq_id; + struct file *filep; +}; + struct nvme_ctrl_ops { const char *name; struct module *module; --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C364A23F41D for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; cv=none; b=u5AwgiBSQFS8Tnx9NNnFwEWmGyntRRWgrpchsULumg2+m2gehS0J3xs0hoWZ0wUPQA6fNerTMzPY0VuxxsYv6WxQfIVTlE9iBpTRPcR8upmTzcHz5rQXrVCdXdLNvPoPjHNSd1XsTDoztcZLvI7n0Bjjw9EEv3+nXChdXRFno20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; c=relaxed/simple; bh=TtseZ4TcQtCKALUdMCarP65Y58vXB5ipsP5nGvWI3FY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q1KPE71nv7dMIEzdi/Ns8sLoWShr4cH/ulD+HXS3DbI3nuHb4KNw0L97/Zxva+Cv5qpheA0MmrxWDto3ulH3vRozhfABj+Gb7HiyFO1FU0y1+UMu2PNx4Xr+9fNGz+IR/jex5BXoFLUNV1GUILl63LB37X5p5ackXbiY2TpWBNQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RxLAYrQM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RxLAYrQM" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9E29AC4CEF9; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=TtseZ4TcQtCKALUdMCarP65Y58vXB5ipsP5nGvWI3FY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RxLAYrQM9UqYP7C4TilHtGc7c8TRpikQVjJnB+DghKCQOrjJQ5QZJ5MlQSttA9t8Z LOKTaOEB7MGfMEitIuhS+xsdjJ8lVW5nPIUywf2qkpmmqseazdaWBXvj5bjnPOWh10 W4w5JiI2h1qbDj/4kd6MJEVepjD8ZC6GHc/cXbTGLAgRn5PPsGcGd4EuKpd7z+qwvc rTLfA3Pv6+jojXQRrShgauK5QAeDczRZHS6EbVOVP8hAGhkxGQSzj6mgJSP+lbm919 kIcgNo3cUy0OOIbctOEOUziDchPumjzC86lT+tm9kRtyHIUJk+nofYNiEDIlseDllf 8l5ApjeILOcmA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 947A9C83F17; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:34 +0200 Subject: [PATCH RFC 3/8] nvme: Add file descriptor to read CDQs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-3-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4170; i=joel.granados@kernel.org; h=from:subject:message-id; bh=TtseZ4TcQtCKALUdMCarP65Y58vXB5ipsP5nGvWI3FY=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yupLwwxxgJrdT4OCImvVb4tPC51BwzORZ pOM+8l5nbK/zYkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrqAAoJELqXzVK3 lkFPZd8L/RkR/7Fkg+619MfcZxBcXjZMOxL7y2OrZGCmS+dje9Lgd0/QgfCfwKb2/OXbeKfjr98 2I4Xj1un/j9+qOdJj+v2F2J7F9eqsmp+0qT5b1l+LvhB5zwCE1sk//KQIH20xTRmeJjJCLsKrIA vjIxz6vIF6qNmiLjvZQfAOeqwk2jvczAEUO7y2hqSZBXqBWO6Umzpf04Kek6i1kWJ9uSS/VRAT9 6EL9+Pa9EN+V5P29zCqsBcj5WdnxjHb4wzkPbbXMLdvLKEVcdqEyOogVt0DPzbQXQtJN+Ir2GZM moBm+Iw54083IQalIPhyU8ku1H1nZYDaTyQ4EwACAXfBwmdNtzvSSYBTGbe7lkb9avOuuwYfGTe Rw5dFwqcPbp3tVv7GoXgc8yFA5bX5inogPEzYa67MEmEpRq0KdC8IAAL6xKFU1MUDiiT7Frsc7z JxxRO4CqPfilGrDQcaAWHgXOXBEp602tBmtQS/5rrT3v8lMDHyoDICJYBRKuOMA00qaF3/JS9b7 74= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 The file descriptor provided by nvme_cdq_fd is to be used to consume the entries in the newly created CDQ. This commit both adds the creation of the file descriptor as well as the mechanism to read and copy entry data back to user space. All available entries are consumed on every read. Phase bits and current head are updated before sending the cdq feature id which tells the controller the entries have been cosumed. The nvme_cdq_fd is not called anywhere yet as this is a preparation commit for when the CDQ create and delete are added. Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 91 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 91 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 9b2de74d62f7a65aea2d28bbbed6681195d9afcd..8517253002941e1f892e62bb7da= cac40395b16d9 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -23,6 +23,7 @@ #include #include #include +#include =20 #include "nvme.h" #include "fabrics.h" @@ -1228,6 +1229,96 @@ u32 nvme_passthru_start(struct nvme_ctrl *ctrl, stru= ct nvme_ns *ns, u8 opcode) } EXPORT_SYMBOL_NS_GPL(nvme_passthru_start, "NVME_TARGET_PASSTHRU"); =20 +/* Returns true if curr_entry forwarded by 1 */ +static bool nvme_cdq_next(struct cdq_nvme_queue *cdq) +{ + void *curr_entry =3D cdq->entries + (cdq->curr_entry * cdq->entry_nbyte); + u8 phase_bit =3D (*(u8 *)(curr_entry + cdq->cdqp_offset) & cdq->cdqp_mask= ); + /* if different, then its new! */ + if (phase_bit !=3D cdq->curr_cdqp) { + cdq->curr_entry =3D (cdq->curr_entry + 1) % cdq->entry_nr; + if (unlikely(cdq->curr_entry =3D=3D 0)) + cdq->curr_cdqp =3D ~cdq->curr_cdqp & 0x1; + return true; + } + return false; +} + +static int nvme_cdq_send_feature_id(struct cdq_nvme_queue *cdq) +{ + struct nvme_command c =3D { }; + + c.features.opcode =3D nvme_admin_set_features; + c.features.fid =3D cpu_to_le32(NVME_FEAT_CDQ); + c.features.dword11 =3D cdq->cdq_id; + c.features.dword12 =3D cpu_to_le32(cdq->curr_entry); + + return nvme_submit_sync_cmd(cdq->ctrl->admin_q, &c, NULL, 0); +} + +/* + * Traverse the CDQ until max entries are reached or until the entry phase + * bit is the same as the current phase bit. + * + * cdq : Controller Data Queue + * count_nbyte : Count bytes to "traverse" before sending feature id + * priv_data : argument for consume + */ +static size_t nvme_cdq_traverse(struct cdq_nvme_queue *cdq, size_t count_n= byte, + void *priv_data) +{ + int ret; + char __user *to_buf =3D priv_data; + size_t tx_nbyte, target_nbyte =3D 0; + size_t orig_tail_nbyte =3D (cdq->entry_nr - cdq->curr_entry) * cdq->entry= _nbyte; + void *from_buf =3D cdq->entries + (cdq->curr_entry * cdq->entry_nbyte); + + while (target_nbyte < count_nbyte && nvme_cdq_next(cdq)) + target_nbyte +=3D cdq->entry_nbyte; + tx_nbyte =3D min(orig_tail_nbyte, target_nbyte); + + if (copy_to_user(to_buf, from_buf, tx_nbyte)) + return -EFAULT; + + if (tx_nbyte < target_nbyte) { + /* Copy the entries that have been wrapped around */ + from_buf =3D cdq->entries; + to_buf +=3D tx_nbyte; + if (copy_to_user(to_buf, from_buf, target_nbyte - tx_nbyte)) + return -EFAULT; + } + + ret =3D nvme_cdq_send_feature_id(cdq); + if (ret < 0) + return ret; + + return tx_nbyte; +} + +static ssize_t nvme_cdq_fops_read(struct file *filep, char __user *buf, + size_t count, loff_t *ppos) +{ + struct cdq_nvme_queue *cdq =3D filep->private_data; + size_t nbytes =3D round_down(count, cdq->entry_nbyte); + + if (*ppos) + return -ESPIPE; + + if (count < cdq->entry_nbyte) + return -EINVAL; + + if (nbytes > (cdq->entry_nr * cdq->entry_nbyte)) + return -EINVAL; + + return nvme_cdq_traverse(cdq, nbytes, buf); +} + +static const struct file_operations cdq_fops =3D { + .owner =3D THIS_MODULE, + .open =3D nonseekable_open, + .read =3D nvme_cdq_fops_read, +}; + void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 eff= ects, struct nvme_command *cmd, int status) { --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D70D523F429 for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; cv=none; b=nvFVcr8Y1XkswQDL2XgPQDd7d04DRRwMEqvFne21jX+6Ol7B/34f4PUY9LjbXY7bI2rU8f/LRVL4AxxR8eokeWbC6mrhO4xxlF/VRxd0YHYEpIl2DeKGsl3JDNoDUCvHZ2OU9AuVwau02oWJc7KN3BkR0vwoAL4mX6JeLV7VU+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; c=relaxed/simple; bh=WsX7hcIyFm4dMbAOUYGrKt7OTqWvO82Aiuj8j74Pk2Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qAT9o/Tj8XVQpDg6ByiEpr+BcZxiQ4F/mGgOm2UtCZSTrR0hvhjbvnl1ABjF+4nSnv1hPvmooho0D9Zwf//ZQfwNJCP9q82cbIlHRhnkaitURW9NtYvO0YaiC1x40Pv45bjcdGDE5+kvuwDKRjtGmYKV9JL8PJswJ1O4CSGvoZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Gs4tMdyv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Gs4tMdyv" Received: by smtp.kernel.org (Postfix) with ESMTPS id A805AC4CEFC; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=WsX7hcIyFm4dMbAOUYGrKt7OTqWvO82Aiuj8j74Pk2Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Gs4tMdyvdrRzvUzYONF33NlvkeriwOemS+NJ4wCckTPn17RzUebzIOeO99wCpx8d4 xNeZJv7aVZQ2zXOnvY4NwgLIchcyHvNAvyhxlnHdhEVxn0Cb3YPUlsUVMs0aClHchB 2h7LqiEbOSXbz8cAYXLYbcNe1T7DXF38OF3iVTR2YeUn1owym/ATKf1RqJxGdlEhpR J06UUcb21yyh9ubmcY7tZkd3YHZ3JziKzpdkR75Pur32bCzx+zOQctsRO9i8wlaqyA MYcPiRuCf4dE1AOwaXHizucDrnmsGVM4yzCuvIKt2EtKMfuogR/wmV4k3VqyH0pV4q atkpG0HejxA/Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0F51C83F1B; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:35 +0200 Subject: [PATCH RFC 4/8] nvme: Add function to create a CDQ Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-4-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4559; i=joel.granados@kernel.org; h=from:subject:message-id; bh=WsX7hcIyFm4dMbAOUYGrKt7OTqWvO82Aiuj8j74Pk2Y=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yut+CRAAF2WeI+nxckU5chr/WGQv7bQHt FAOvSuXctaGz4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrrAAoJELqXzVK3 lkFPqRoL/0XZbSFA0Z2nGnWPGUR+nDcg3bcZCUu7fGNOpcwQKJ5uipw/kkiNNcID9aSTLudHjs9 0qg9zoaefDbkmNrEakQzuzvPqOM94GGfhBNx9KiiStNK0f1wFw9PP5MocKZAb6Hp5LMfkWFKmpx 7gZkeyXjxGkXggB38G53jV31n8WuFfALwTuUGfTkYJWLaLresYSSZbPCeuip5TPoC4gw7K277bH d/xU5BMDwl/5GdDKDZDl1ebMwlX/ZVyxf6cbYsebTa4rusuaaYlX7N4Sv7wS+PXRp4eSyi4TkJh +ihoXlYKbNh9zEn50wFgsubKCJSu9MLHAvTNF3/dRW3qmL+d6TYJvDbQBXCvSd7U3/mokozFAEt LtmvhMfBtzfINKlbYzcUdT6agL4aHci7+1fhJKQmUCMFTQEVkYJmYoZbjPVxcim/DiYM99WkdGx 8KPW1Ib5RRXDPEO0yiJ8WBr67ca/yRdxY5ruF5nYC1wJ3nzhacmGbMJ0R3c8s6xq0hKcC17AY55 0I= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 On CDQ initialization: * The memory holding the CDQ structure (struct cdq_nvme_queue) is allocated, * DMAable memory for the entries is allocated. * A CDQ create command is sent to the controller * The newly created CDQ is stored in ctrl->cdqs * A CDQ file descriptor is created * The CDQ id returned by the controller and the file descriptor value are returned to the user Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 116 +++++++++++++++++++++++++++++++++++++++++++= ++++ drivers/nvme/host/nvme.h | 4 ++ 2 files changed, 120 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 8517253002941e1f892e62bb7dacac40395b16d9..81b7183a4e3167290e68dc2eb26= a8dbcd88c7924 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1319,6 +1319,122 @@ static const struct file_operations cdq_fops =3D { .read =3D nvme_cdq_fops_read, }; =20 +static int nvme_cdq_fd(struct cdq_nvme_queue *cdq, int *fdno) +{ + int ret =3D 0; + struct file *filep; + + *fdno =3D -1; + + if (cdq->filep) + return -EINVAL; + + filep =3D anon_inode_getfile("[cdq-readfd]", &cdq_fops, cdq, O_RDWR); + if (IS_ERR(filep)) { + ret =3D PTR_ERR(filep); + goto out; + } + + *fdno =3D get_unused_fd_flags(O_CLOEXEC | O_RDONLY | O_DIRECT); + if (*fdno < 0) { + ret =3D *fdno; + goto out_fput; + } + + fd_install(*fdno, filep); + cdq->filep =3D filep; + + return 0; + +out_fput: + put_unused_fd(*fdno); + fput(filep); +out: + return ret; +} + +static int nvme_cdq_alloc(struct nvme_ctrl *ctrl, struct cdq_nvme_queue **= cdq, + u32 entry_nr, u32 entry_nbyte) +{ + struct cdq_nvme_queue *ret_cdq =3D kzalloc(sizeof(*ret_cdq), GFP_KERNEL); + + if (!ret_cdq) + return -ENOMEM; + + ret_cdq->entries =3D dma_alloc_coherent(ctrl->dev, + entry_nr * entry_nbyte, + &ret_cdq->entries_dma_addr, + GFP_KERNEL); + if (!ret_cdq->entries) { + kfree(ret_cdq); + return -ENOMEM; + } + + *cdq =3D ret_cdq; + + return 0; +} + +static void nvme_cdq_free(struct nvme_ctrl *ctrl, struct cdq_nvme_queue *c= dq) +{ + dma_free_coherent(ctrl->dev, cdq->entry_nr * cdq->entry_nbyte, + cdq->entries, cdq->entries_dma_addr); + kfree(cdq); +} + + +int nvme_cdq_create(struct nvme_ctrl *ctrl, struct nvme_command *c, + const u32 entry_nr, const u32 entry_nbyte, + uint cdqp_offset, uint cdqp_mask, + u16 *cdq_id, int *cdq_fd) +{ + int ret, fdno; + struct cdq_nvme_queue *cdq, *xa_ret; + union nvme_result result =3D { }; + + ret =3D nvme_cdq_alloc(ctrl, &cdq, entry_nr, entry_nbyte); + if (ret) + return ret; + c->cdq.prp1 =3D cdq->entries_dma_addr; + + ret =3D __nvme_submit_sync_cmd(ctrl->admin_q, c, &result, NULL, 0, NVME_Q= ID_ANY, 0); + if (ret) + goto err_cdq_free; + + cdq->cdq_id =3D le16_to_cpu(result.u16); + cdq->entry_nbyte =3D entry_nbyte; + cdq->entry_nr =3D entry_nr; + cdq->ctrl =3D ctrl; + cdq->cdqp_offset =3D cdqp_offset; + cdq->cdqp_mask =3D cdqp_mask; + + xa_ret =3D xa_store(&ctrl->cdqs, cdq->cdq_id, cdq, GFP_KERNEL); + if (xa_is_err(xa_ret)) { + ret =3D xa_err(xa_ret); + goto err_cdq_free; + } + + ret =3D nvme_cdq_fd(cdq, &fdno); + if (ret) + goto err_cdq_erase; + + *cdq_id =3D cdq->cdq_id; + *cdq_fd =3D fdno; + + return 0; + +err_cdq_erase: + xa_erase(&ctrl->cdqs, cdq->cdq_id); + +err_cdq_free: + cdq_id =3D NULL; + cdq_fd =3D NULL; + nvme_cdq_free(ctrl, cdq); + + return ret; +} +EXPORT_SYMBOL_GPL(nvme_cdq_create); + void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 eff= ects, struct nvme_command *cmd, int status) { diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 800970a0bb87f7a3b6e855f56a2493a7deed1ecd..ddec5b44fe022831280458ed9fc= 1cb1ed11633b7 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -1207,6 +1207,10 @@ u32 nvme_passthru_start(struct nvme_ctrl *ctrl, stru= ct nvme_ns *ns, u8 opcode); int nvme_execute_rq(struct request *rq, bool at_head); void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 eff= ects, struct nvme_command *cmd, int status); +int nvme_cdq_create(struct nvme_ctrl *ctrl, struct nvme_command *c, + const u32 entry_nr, const u32 entry_nbyte, + uint cdqp_offset, uint cdqp_mask, + u16 *cdq_id, int *cdq_fd); struct nvme_ctrl *nvme_ctrl_from_file(struct file *file); struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid); bool nvme_get_ns(struct nvme_ns *ns); --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF14A23F42A for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; cv=none; b=NlTaTrL5VRHZai10zblppaeWHOUJdeRKAMej0P+tOG3V411+fFusPVYV7i9h9Ypc2RSi1l1fe/bsSnPUK5AWFQJhct18hDauWscT/6kRF1kuY8ZB3BvTkX+u0tVEhWIVQJtZY8AnTjGrmuHBuezis8lcoz7RlYOyHGqgJCh0dS0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484591; c=relaxed/simple; bh=h/8HKJiIxonpUreNA5H+hoWGCKVY95KaVnm3Y8PyTeQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nm4FE96Dp9IrTCKS3DEKQrvsniS6s/TjNF86j/2+WzD2yoN5mvXKighHEb+g8RiT5DwVda4JTlgPobjCvBe9S1/V8JjkwgdFVFEE7g7rYCkr8dkAHjZPMxeANbnIJ69wQgLpzvq5ZKHmbIl1ZPzZiBIQNQb4K7Eu4jvcDdVWHyw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SUroSGtR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SUroSGtR" Received: by smtp.kernel.org (Postfix) with ESMTPS id B5C76C4AF0B; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=h/8HKJiIxonpUreNA5H+hoWGCKVY95KaVnm3Y8PyTeQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=SUroSGtRJ9z82LXiBynUM1EcVsoNxv2tVbZNstl1sgpg3pGkbEm0ON1hAR+PdZoV6 lCoIm6f6qGAEvuXn0xnP/A2L9wqrdCk88n3NAsyyHWNQF6vfLbD/9nvuZYQ7Z+nGNN qcdiEEeCcuyIzqG9HQ9KsX7rTObExamHrYyRcZXUJrNiW6GQcnFa+5dMv94UzUHbxK xzuCd4MMolbHj3uiVNNdobVWduzH1gi9gTp5/VdWvYLltiqTmvIuMkHK3Lw7FNBm2P 23agrba6zX/JyloeMS4f7cpHcKRAT+b6kLsxVjMkU85O5Vk1wQhHPJACQV20BfKwNR xBWW2UKB9krUg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD75FC83F1A; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:36 +0200 Subject: [PATCH RFC 5/8] nvme: Add function to delete CDQ Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-5-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2669; i=joel.granados@kernel.org; h=from:subject:message-id; bh=h/8HKJiIxonpUreNA5H+hoWGCKVY95KaVnm3Y8PyTeQ=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yuudcGZUR2uVvVZVbTvw7vHJi5lLEu15d lrtXTGNT5iAAYkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrrAAoJELqXzVK3 lkFPgA4MAJnh8BX1id2J+lN8ZFOg/K6xgneL3zZWCqjDcUOU1mvQsFqK1ymrCwSHqfA/4HcwV5A vdKcwXkvwNRfuEA7u7IsQG07hccZ1NKIVv0lwyPIlAjmoqL2RxrviO+RLOVRckf2ce4Dka4+N69 eh3zYsfP2G0K9Gjc0kxt5PcZ4X+lgE0o1+m9fdS3R5smtjlfp33mmM0GpFqSadzML8HmmloMqdv 9S2A0Ss8DVuK6HQl4j+ulYPUX+7l67hDSvM6m/PVNC6A6L7fCu/JdUnMQrjmeWn3nmJ1KXRDbEv LjMHmPDdftztDRvHLLuXvqvAxj1nEnNpWHqk1uPG3+A9fCC/HK8GAj9Z128CU8HuwgLJ6HEvOcO 5a+S6YWfCi6hKsz/5vUhaVPQvhQbKCTNw+kWTaxQZL2B0z3yYzcmCzktP3xtCpeaMruF5R6m+8k FEZNOYkcX/c1spi/xH+npL322AklGng6uFcyd91Nf9GlU0CU9mUW69t7nNtLmxuJSF24u0oVv5+ AE= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 The delete function frees the memory held by the CDQ pointer, removes it from the xarray and submits a NVME command informing the controller of the delete. Call cdq delete on nvme_free_ctrl. Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 36 ++++++++++++++++++++++++++++++++++++ drivers/nvme/host/nvme.h | 1 + 2 files changed, 37 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 81b7183a4e3167290e68dc2eb26a8dbcd88c7924..427e482530bdb5c7124d1230f35= 693ba756ce4d9 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1435,6 +1435,41 @@ int nvme_cdq_create(struct nvme_ctrl *ctrl, struct n= vme_command *c, } EXPORT_SYMBOL_GPL(nvme_cdq_create); =20 +int nvme_cdq_delete(struct nvme_ctrl *ctrl, const u16 cdq_id) +{ + int ret; + struct cdq_nvme_queue *cdq; + struct nvme_command c =3D { }; + + cdq =3D xa_erase(&ctrl->cdqs, cdq_id); + if (!cdq) + return -EINVAL; + + c.cdq.opcode =3D nvme_admin_cdq; + c.cdq.sel =3D NVME_CDQ_SEL_DELETE_CDQ; + c.cdq.delete.cdqid =3D cdq->cdq_id; + + ret =3D __nvme_submit_sync_cmd(ctrl->admin_q, &c, NULL, NULL, 0, NVME_QID= _ANY, 0); + if (ret) + return ret; + + nvme_cdq_free(ctrl, cdq); + + return 0; +} +EXPORT_SYMBOL_GPL(nvme_cdq_delete); + +static void nvme_free_cdqs(struct nvme_ctrl *ctrl) +{ + struct cdq_nvme_queue *cdq; + unsigned long i; + + xa_for_each(&ctrl->cdqs, i, cdq) + nvme_cdq_delete(ctrl, i); + + xa_destroy(&ctrl->cdqs); +} + void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 eff= ects, struct nvme_command *cmd, int status) { @@ -5029,6 +5064,7 @@ static void nvme_free_ctrl(struct device *dev) if (!subsys || ctrl->instance !=3D subsys->instance) ida_free(&nvme_instance_ida, ctrl->instance); nvme_free_cels(ctrl); + nvme_free_cdqs(ctrl); nvme_mpath_uninit(ctrl); cleanup_srcu_struct(&ctrl->srcu); nvme_auth_stop(ctrl); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index ddec5b44fe022831280458ed9fc1cb1ed11633b7..07a1a9e4772281d68d0ade04233= 72a35f9f7055e 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -1211,6 +1211,7 @@ int nvme_cdq_create(struct nvme_ctrl *ctrl, struct nv= me_command *c, const u32 entry_nr, const u32 entry_nbyte, uint cdqp_offset, uint cdqp_mask, u16 *cdq_id, int *cdq_fd); +int nvme_cdq_delete(struct nvme_ctrl *ctrl, const u16 cdq_id); struct nvme_ctrl *nvme_ctrl_from_file(struct file *file); struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid); bool nvme_get_ns(struct nvme_ns *ns); --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 060F6241114 for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; cv=none; b=URnHNj7CPLQ90+tm2znr8JyylhzebHopry/8I5EqNrytgAcSQwRsJqnjbmf2Y202xXpY790IxQZRSaKv5zblcGfNqz7nKvREiOprFoe3iZCk4kbTkqiYuKkURjSu/ev17IqUbekxEDlgZI/R02p32Jzi+muIHAMdUk3j0Xl/pNo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; c=relaxed/simple; bh=EHkkGMG990RW999qEL6xHGIOP1Da82Ed2KKxscvok4M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=isWGdn7KbUwiMoiOn3djnuJ3LyGTFSkLsZwHmd0BNK1zCbiN+roXDa8qlYxhPGAHSo1XKZChZK7zEtL3YFqmC3yTu30Qq2oiVXUcEZmZKRzyu+wYjUo3kyC94y4D8BxT9NsZnAX8SlakkUuDrZ2k5r9Lp/YiTGGLdarBCJMMnKc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dHYti68u; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dHYti68u" Received: by smtp.kernel.org (Postfix) with ESMTPS id C26FFC4AF0C; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=EHkkGMG990RW999qEL6xHGIOP1Da82Ed2KKxscvok4M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dHYti68u5key3zQoDOmqHc1mq5/Ji1JpVzQ3rNOXdksoiB56fb8yC1EVTVun1uPP7 LBntUcZvWq8ofUdCL7vz+3mxBJbBHGPzoBuFwQQOdoaPBMMyuBsDMqwxh7WkJ5MBOr rCHT4k4SQTqcz4jv9eSRfO1ma5pJelcKnB7DaBcBN4YW/tSqQfnYcxHGNAU24Ei4xb 6RQHb3BEvhWaegwNVCO0u5rBCm//mlCNubqAIa3T1ttwZUEjCItGjS611zyCZpvj4i VUEs1lSBOjqcxsVBRMNjhl/qTbVMpGGumsFiPUXIUcupZcZFsSaDdF9mUaAAzubs8V yxfh3lDgAf0gQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB39BC83F26; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:37 +0200 Subject: [PATCH RFC 6/8] nvme: Add a release ops to cdq file ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-6-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1127; i=joel.granados@kernel.org; h=from:subject:message-id; bh=EHkkGMG990RW999qEL6xHGIOP1Da82Ed2KKxscvok4M=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yuzCPnoh3XuDoNYYYg9pd/tFQFMVzY5jm 1hhsoBW+XgbM4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrsAAoJELqXzVK3 lkFPKH0L/0qsA6rA7Qq1k+nKg8zYcsedZJbW9A+9Njb5EJ9ozssyLfDi/X3F7mERgG3L4s06IMM lIXAJW6WeOi/bsENRotDv1nJmzZYbHF2zEjNjYnM0WgGbOzxHk1vgAmvd8ZXk61GAqal+gm4MsB 7CxCoxBnFGCmzkpuOdqJrMM2FGQ8JROLPd0tqkwwbT0G+BvFp6UU8luqhfy9T8BVohqsBriRiRL tpUfm7nj9DqOhLMNMUhUbkbWdANEGzhvSioV2Dxtd+JbGMzIH72e4wZAG3Vrf7Pl5X+yP/IFd4d fxxHgq1CEQnRJscAFA05rYDaTQjKVgHkfZqNAhAkRtyetX4OU9B+MrcQ/pMze3S5MrrfAsEmc0T mT++IqnKhop6Jv88b6GXHvIWzgsPg+SfttxF91MNHrxJEJ9O8AvLuNTxB24lh+vQ5SzLG65cxzN ccvbUNGREcQtQXRNn3qGPeKVjA7X49tGvIPT/QcJvCXbDB6WQ6CGllmjtwMKNVsj8EHt2j02x97 HE= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 When user space calls close on the file descriptor or crashes, nvme_cdq_fops_release will ensure everything related to the CDQ is properly released. Signed-off-by: Joel Granados --- drivers/nvme/host/core.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 427e482530bdb5c7124d1230f35693ba756ce4d9..4745b961c6b874375ff4399c104= f312b5ac608b8 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1313,10 +1313,18 @@ static ssize_t nvme_cdq_fops_read(struct file *file= p, char __user *buf, return nvme_cdq_traverse(cdq, nbytes, buf); } =20 +static int nvme_cdq_fops_release(struct inode *inode, struct file *filep) +{ + struct cdq_nvme_queue *cdq =3D filep->private_data; + + return nvme_cdq_delete(cdq->ctrl, cdq->cdq_id); +} + static const struct file_operations cdq_fops =3D { .owner =3D THIS_MODULE, .open =3D nonseekable_open, .read =3D nvme_cdq_fops_read, + .release =3D nvme_cdq_fops_release, }; =20 static int nvme_cdq_fd(struct cdq_nvme_queue *cdq, int *fdno) --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0397324061F for ; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; cv=none; b=NPIW6A0TA9/c1Uu+oUIzC8M4H/X/LKDETQoeWvFetHET0u2rg8ufc+PnI7FBjqMiSJ3+Kv9p6DuBDX/CstyJ7U9rqoLJOzSfOy07b1Br7wPDAhYKpoq6OV3wKzqLQFg6t2T/6iaDB/DA/MVfG01BvcyzRsp50HNicSFxKv+3b8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; c=relaxed/simple; bh=dv2xzXC+6TJZt9TJ3U/97Y9njM2Cu8lc2Jl+hxwFXTg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qN4SwslIjiZ1tR2eAYWcQGGrGQ4oTRcQmuSS1up4vGS8gbG5rW96Tpmcgt4bDAcQtiFNh/+SvC9ZGOGAv0iByLYKoDTgKoYVz7wo2+GbF6UJ39QodYrxuuEyfBael8AsRGnNzAnM99n9gmh1gPJXadRSt7SuS2toj4RZOmEuA9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vANEBRxs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vANEBRxs" Received: by smtp.kernel.org (Postfix) with ESMTPS id D0473C4AF0D; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=dv2xzXC+6TJZt9TJ3U/97Y9njM2Cu8lc2Jl+hxwFXTg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=vANEBRxso8AO+F3t9PmhLE9ASwUpc8aPCXwvHEmYXUXIdRJzu9UuewMglEEzxzgda NniBKk4nsw/5jCL6z1GomlxSicv16Ozq6ysxHZoEY0tJueydkqsHMazGIs5hYD7g1u yH9CPMjOwh4+UzOCMTrwGjrbuZWJARvmdPH75CJKIGPvxVxOdr1dnBc4ZeecMIUmMf oDRWSPjDOhryyazWdHG51zF9KANPGQrRwGjlKvalv+sv0AyL/srRVo/mgRKXAS+dhW MUUPrXYWbXGKprkMR6fXcb5pMbCHqSi3iAohMSEvSL18DcuIdB9KB6DZykLdUh0o58 QOJMW3WKJ3rsA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8EFDC83F25; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:38 +0200 Subject: [PATCH RFC 7/8] nvme: Add Controller Data Queue (CDQ) ioctl command Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-7-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1721; i=joel.granados@kernel.org; h=from:subject:message-id; bh=dv2xzXC+6TJZt9TJ3U/97Y9njM2Cu8lc2Jl+hxwFXTg=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yuzaV4yProMruCg+StvkS6ozjmlyR+D12 60MLLqag8RnjokBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrsAAoJELqXzVK3 lkFPhosL/10webJ+d9JVE+imM2vxDxzAqBP41TUHUEaBoxiWc5QMF2R1JzIGW6HrfyPN3JXplP8 RAiqMmOBG28z+vGVt2c/BUKIlSN+X/ba7vXkGWIWjLqB+lMcr62mJDmf20cTjKa2pgZ1udbqd5G WuH1VkC4tDeGyvIy+qmgecW+zQOjUlTfeKz2e2KIhDgErp7m1GvTRXmQO0fsgFTIEhM5MEkoVsU U0VyNf/rp/QOKCrpBZaMapENcrGpmKv2U5uPQwPnQ0jNl2Ixp7Wq7xpVbMPB9JA9bdnlM4CFAHd A/oEsc7Ihe6HskrIrtsm+xziTjFUoPp3/qPyy7y1Y8cgMajjES9TZHKAH+G3KAOYHnvVDIklrCf Oo39RvqgS2nPGuakkWb1i4RR/D1NvAuJqMpZcsi+UinuTPgKlE3hn7Yg9fSdEnrH+ow4TeEV8lR qMQDd5+xskxvFw01WKi3VbpOeMhrKx+X1VQm1WvdjFN9sUlnpsTNUs5QsEmQFjxrE0Wx9kCe7v5 6o= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 New ioctl to create a CDQ. Creating a CDQ: Set the following memebers: * entry_nr: Number of CDQ entries * entry_nbytes: size in bytes of each CDQ entry * cqs: Create Queue Specific. Value depends on CDQ type * mos: Management Operation Specific. Value depends on CDQ type * cdqp_{offset,mask}: Location of CDQ Phase tag bit within an entry Return: * cdq_id: The ID set by the controller for the created CDQ * read_fd: The file descriptor that can be used to read the CDQ Signed-off-by: Joel Granados --- include/uapi/linux/nvme_ioctl.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/uapi/linux/nvme_ioctl.h b/include/uapi/linux/nvme_ioct= l.h index 2f76cba6716637baff53e167a6141b68420d75c3..dc434628acc8462877e774a1eec= 9242a5df8a08a 100644 --- a/include/uapi/linux/nvme_ioctl.h +++ b/include/uapi/linux/nvme_ioctl.h @@ -92,6 +92,17 @@ struct nvme_uring_cmd { __u32 rsvd2; }; =20 +struct nvme_cdq_cmd { + __u32 entry_nr; + __u32 entry_nbyte; + __u16 cdq_id; + __u16 cqs; + __u16 mos; + __u32 cdqp_offset; + __u32 cdqp_mask; + int read_fd; +}; + #define nvme_admin_cmd nvme_passthru_cmd =20 #define NVME_IOCTL_ID _IO('N', 0x40) @@ -104,6 +115,7 @@ struct nvme_uring_cmd { #define NVME_IOCTL_ADMIN64_CMD _IOWR('N', 0x47, struct nvme_passthru_cmd64) #define NVME_IOCTL_IO64_CMD _IOWR('N', 0x48, struct nvme_passthru_cmd64) #define NVME_IOCTL_IO64_CMD_VEC _IOWR('N', 0x49, struct nvme_passthru_cmd6= 4) +#define NVME_IOCTL_ADMIN_CDQ _IOR('N', 0x50, struct nvme_cdq_cmd) =20 /* io_uring async commands: */ #define NVME_URING_CMD_IO _IOWR('N', 0x80, struct nvme_uring_cmd) --=20 2.47.2 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B499241139 for ; Mon, 14 Jul 2025 09:16:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; cv=none; b=lVHbxajac4Ubuj8Y664/A+d3XfRFUtCAHCOdactO4GIwbAa99rwQszMa//9tegi8tQvhD29NvXh7STXc3q0BkJXg2FAX2fLKhdpek0nAQUJ8V4BlkdU6xsfvWBbdaEz3V87JbC+QmviG4AJVJBVMRdha6ZwrkG25riA+vAAFtR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752484592; c=relaxed/simple; bh=El37Gj/bO4g5zQC6jForLJm2KfkQjW+oJE5NpN3BFes=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bXpxQiZI7eETmnAi3SxZs/aEMTNyyMCzvcv2Ci/DRZd8j1AREck19Lqg8iKHFNf60bQbDNirr4pOewNgdBqKy9U7i15NaQ7frSocEZjgjn04gc1+u8fvMvZWm4nf5d7g2tQVTEM7SdC2CtJ0dAoubURbOTe4w3KOK4Ply/LRgCc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XmLcoTaF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XmLcoTaF" Received: by smtp.kernel.org (Postfix) with ESMTPS id DE43AC4CEF8; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752484591; bh=El37Gj/bO4g5zQC6jForLJm2KfkQjW+oJE5NpN3BFes=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XmLcoTaFIRGtlZ/dEwW7fMhbaDgr8GgZXbTWgHo7zGVxDn4qXZL5uo4KsA1NUdZR4 pQuYQzUo0yVkUhVtuL/W1LQWyTGGitBK5p25Psm2pSyOfwMJ8qu9F4Y25lMyZdaWns QyMAyfuhSqX4fLts90/+ma9/kt+ok/NZGSqWY7Xv1IWfbWj8xerKXghPIgxxMto1Mo z/2BbVz4eMnn8fgwnaCZMnL3Be2iy8iRlqwt+z/e31Ob0q2Wtx+Jd1E7ReQSc4arNC TDx+iJvMBgwnIdmN1lXvoBUjn/LtabaqpXWMMj+TTNAyxFbk44B/6aElz+NwzLY+3j 8vKPlvfOvrPKA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6E80C83F1B; Mon, 14 Jul 2025 09:16:31 +0000 (UTC) From: Joel Granados Date: Mon, 14 Jul 2025 11:15:39 +0200 Subject: [PATCH RFC 8/8] nvme: Connect CDQ ioctl to nvme driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-jag-cdq-v1-8-01e027d256d5@kernel.org> References: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> In-Reply-To: <20250714-jag-cdq-v1-0-01e027d256d5@kernel.org> To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg Cc: Klaus Jensen , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3054; i=joel.granados@kernel.org; h=from:subject:message-id; bh=El37Gj/bO4g5zQC6jForLJm2KfkQjW+oJE5NpN3BFes=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGh0yu1QDNzxro8uFOrjz5Om6eL02tjmaGJu5 aLz1ZtA3CJvJIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJodMrtAAoJELqXzVK3 lkFPKYcL/Aj/dE4mCCSzsfDlmLZU5vG9LCjMgMNhbWmVgR1IikffXCVuR95AW50beEaxpCO6FpL WK1u0mq6NGFl2m+TL7VzOFZefVQecM01MKSUtmKS5G+aigVL8qpkdMY36cHEd5HBr0bPN1sMpIQ 6QnIUxpDFntnTtBapJaHqof42yxORjUq7gFbi0jKgrL5UZ6spXnV7aQ0+Dl+QpOdyRJBg1HxSO3 +br6NweNXKCOJ9BJCZrNXrz79sT8dIwmWh252JUDz++ifiJ2soO4czczOocyHzG8ebgVHtTmUg5 uunhZFf+cpwVR1ImceGMvwGDE8uuFnqirmYW+1DAzuTbteOIlZBZYulJ1y9uGvORgRlQj7Pymnf PmMj7KpRXwx8LWEcPhH71fJFEqX0R9ZtbRhkuI3qqEM8OyBB+p2zFUWno1kPruI5BJVVDj+65T9 0BdD93axnX4v8CYxlXO715PwNSQ3Z9XqVY5PnvBDE5T3Boz6kX54C+OrQcgl0rbfY8J35G1Q1q7 6o= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 When deleting, call the nvme_cdq_delete directly as there is no additional preparation needed. Construct the nvme admin command to create before sending it down to the driver; this effectively sets mos and cqs among other variables. Once the controller has returned, set the cdq_id and cdq_fd for the ioctl caller. Signed-off-by: Joel Granados --- drivers/nvme/host/ioctl.c | 47 +++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index ca86d3bf7ea49d0ec812640a6c0267a5aad40b79..6ab42381b6fe4e88bae341874b1= 11ed4b7ade397 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -378,6 +378,46 @@ static int nvme_user_cmd64(struct nvme_ctrl *ctrl, str= uct nvme_ns *ns, return status; } =20 +static int nvme_user_cdq(struct nvme_ctrl *ctrl, struct nvme_ns *ns, + struct nvme_cdq_cmd __user *ucmd, unsigned int flags, + bool open_for_write) +{ + int status; + u16 cdq_id =3D 0; + int cdq_fd =3D 0; + struct nvme_command c =3D {}; + struct nvme_cdq_cmd cmd =3D {}; + + if (copy_from_user(&cmd, ucmd, sizeof(cmd))) + return -EFAULT; + + if (cmd.cdqp_offset >=3D cmd.entry_nbyte) + return -EINVAL; + + c.cdq.opcode =3D nvme_admin_cdq; + c.cdq.sel =3D NVME_CDQ_SEL_CREATE_CDQ; + c.cdq.mos =3D cpu_to_le16(cmd.mos); + c.cdq.create.cdq_flags =3D cpu_to_le16(NVME_CDQ_CFG_PC_CONT); + c.cdq.create.cqs =3D cpu_to_le16(cmd.cqs); + /* >>2: size is in dwords */ + c.cdq.cdqsize =3D (cmd.entry_nbyte * cmd.entry_nr) >> 2; + + status =3D nvme_cdq_create(ctrl, &c, + cmd.entry_nr, cmd.entry_nbyte, + cmd.cdqp_offset, cmd.cdqp_mask, + &cdq_id, &cdq_fd); + if (status) + return status; + + cmd.cdq_id =3D cdq_id; + cmd.read_fd =3D cdq_fd; + + if (copy_to_user(ucmd, &cmd, sizeof(cmd))) + return -EFAULT; + + return status; +} + struct nvme_uring_data { __u64 metadata; __u64 addr; @@ -541,7 +581,8 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, st= ruct nvme_ns *ns, =20 static bool is_ctrl_ioctl(unsigned int cmd) { - if (cmd =3D=3D NVME_IOCTL_ADMIN_CMD || cmd =3D=3D NVME_IOCTL_ADMIN64_CMD) + if (cmd =3D=3D NVME_IOCTL_ADMIN_CMD || cmd =3D=3D NVME_IOCTL_ADMIN64_CMD = || + cmd =3D=3D NVME_IOCTL_ADMIN_CDQ) return true; if (is_sed_ioctl(cmd)) return true; @@ -556,6 +597,8 @@ static int nvme_ctrl_ioctl(struct nvme_ctrl *ctrl, unsi= gned int cmd, return nvme_user_cmd(ctrl, NULL, argp, 0, open_for_write); case NVME_IOCTL_ADMIN64_CMD: return nvme_user_cmd64(ctrl, NULL, argp, 0, open_for_write); + case NVME_IOCTL_ADMIN_CDQ: + return nvme_user_cdq(ctrl, NULL, argp, 0, open_for_write); default: return sed_ioctl(ctrl->opal_dev, cmd, argp); } @@ -874,6 +917,8 @@ long nvme_dev_ioctl(struct file *file, unsigned int cmd, return -EACCES; nvme_queue_scan(ctrl); return 0; + case NVME_IOCTL_ADMIN_CDQ: + return nvme_user_cdq(ctrl, NULL, argp, 0, open_for_write); default: return -ENOTTY; } --=20 2.47.2