From nobody Sun Dec 14 06:20:32 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 32439277805; Mon, 28 Apr 2025 09:24:09 +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=1745832249; cv=none; b=bsjfNdzyQrWFQ/irT8x5dHtCu0y3u7asDPRDcNv4POB9I/JWEgu7iQjMrHiN+zS5NyiQb8o1JSY4FrE7EtRJT4NoP+5T/Wzp+ogUGHTZCXC4d+OytlEjDE3LjCOHmX35nvRTS6QCBSTpBqVMsnAq6cZneCbrAdxV6a5zLTmj/f4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745832249; c=relaxed/simple; bh=UaKpIS/gS7437zv6/V/pxWOCRAoH+oFaLCUvPin30s0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jAdLsytzEbtjCAdwJURHnTCtsP2mmPKZvS08Xza+Uy6ge+lHLR1PVL3OIyv57dqYqwkhHWCrNbzPVIJO7s3Z93YSLeAHNAigXtEbzPfDogtENGD2VlI/TsXBdmFogYhN60JJ34yAf+826GPXqWkMqZ7bcztjk6fnTdmNl56QUQw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G/Ukn2zS; 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="G/Ukn2zS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32880C4CEF1; Mon, 28 Apr 2025 09:24:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745832249; bh=UaKpIS/gS7437zv6/V/pxWOCRAoH+oFaLCUvPin30s0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G/Ukn2zSIrjyDxxMBbuxC8G0NNgq427GlA1UdIt9h8WdAt09mSJLJAba2Uk1lLjdc hH7iI67XbyEfiLiAGReOTrPmgM+2w6SXxCJhYj0DC/2JppgeGqGcc8yp0T02GPKplm cxh7af7jGCCF9Z1YVpTA5n7AZuT01VsUpgTbUveUSNG0zsBx2D91spU8nHzbKdRJPk gcuUZzojGyQ2vTalz6AsYECS4vE2AKqovwQhgogBprkg3X9XO2QD386PwCYLTjClDm L2sa6AahrrOtplIHyeQQ0WtZk2mTFeZYNwAoQ0Zr4eUW7xrMGIsTElcXX97TUuMb9O RMHi0c0PYikjA== From: Leon Romanovsky To: Marek Szyprowski , Jens Axboe , Christoph Hellwig , Keith Busch Cc: Jake Edge , Jonathan Corbet , Jason Gunthorpe , Zhu Yanjun , Robin Murphy , Joerg Roedel , Will Deacon , Sagi Grimberg , Bjorn Helgaas , Logan Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Alex Williamson , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Andrew Morton , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-rdma@vger.kernel.org, iommu@lists.linux.dev, linux-nvme@lists.infradead.org, linux-pci@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org, Niklas Schnelle , Chuck Lever , Luis Chamberlain , Matthew Wilcox , Dan Williams , Kanchan Joshi , Chaitanya Kulkarni , Leon Romanovsky Subject: [PATCH v10 21/24] nvme-pci: remove struct nvme_descriptor Date: Mon, 28 Apr 2025 12:22:27 +0300 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Christoph Hellwig There is no real point in having a union of two pointer types here, just use a void pointer as we mix and match types between the arms of the union between the allocation and freeing side already. Also rename the nr_allocations field to nr_descriptors to better describe what it does. Signed-off-by: Christoph Hellwig Tested-by: Jens Axboe Signed-off-by: Leon Romanovsky --- drivers/nvme/host/pci.c | 57 +++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index b178d52eac1b..638e759b29ad 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -43,7 +43,7 @@ #define NVME_MAX_KB_SZ 8192 #define NVME_MAX_SEGS 128 #define NVME_MAX_META_SEGS 15 -#define NVME_MAX_NR_ALLOCATIONS 5 +#define NVME_MAX_NR_DESCRIPTORS 5 =20 static int use_threaded_interrupts; module_param(use_threaded_interrupts, int, 0444); @@ -219,30 +219,22 @@ struct nvme_queue { struct completion delete_done; }; =20 -union nvme_descriptor { - struct nvme_sgl_desc *sg_list; - __le64 *prp_list; -}; - /* * The nvme_iod describes the data in an I/O. - * - * The sg pointer contains the list of PRP/SGL chunk allocations in additi= on - * to the actual struct scatterlist. */ struct nvme_iod { struct nvme_request req; struct nvme_command cmd; bool aborted; - s8 nr_allocations; /* PRP list pool allocations. 0 means small - pool in use */ + /* # of PRP/SGL descriptors: (0 for small pool) */ + s8 nr_descriptors; unsigned int dma_len; /* length of single DMA segment mapping */ dma_addr_t first_dma; dma_addr_t meta_dma; struct sg_table sgt; struct sg_table meta_sgt; - union nvme_descriptor meta_list; - union nvme_descriptor list[NVME_MAX_NR_ALLOCATIONS]; + void *meta_list; + void *descriptors[NVME_MAX_NR_DESCRIPTORS]; }; =20 static inline unsigned int nvme_dbbuf_size(struct nvme_dev *dev) @@ -544,8 +536,8 @@ static void nvme_free_prps(struct nvme_dev *dev, struct= request *req) dma_addr_t dma_addr =3D iod->first_dma; int i; =20 - for (i =3D 0; i < iod->nr_allocations; i++) { - __le64 *prp_list =3D iod->list[i].prp_list; + for (i =3D 0; i < iod->nr_descriptors; i++) { + __le64 *prp_list =3D iod->descriptors[i]; dma_addr_t next_dma_addr =3D le64_to_cpu(prp_list[last_prp]); =20 dma_pool_free(dev->prp_page_pool, prp_list, dma_addr); @@ -567,11 +559,11 @@ static void nvme_unmap_data(struct nvme_dev *dev, str= uct request *req) =20 dma_unmap_sgtable(dev->dev, &iod->sgt, rq_dma_dir(req), 0); =20 - if (iod->nr_allocations =3D=3D 0) - dma_pool_free(dev->prp_small_pool, iod->list[0].sg_list, + if (iod->nr_descriptors =3D=3D 0) + dma_pool_free(dev->prp_small_pool, iod->descriptors[0], iod->first_dma); - else if (iod->nr_allocations =3D=3D 1) - dma_pool_free(dev->prp_page_pool, iod->list[0].sg_list, + else if (iod->nr_descriptors =3D=3D 1) + dma_pool_free(dev->prp_page_pool, iod->descriptors[0], iod->first_dma); else nvme_free_prps(dev, req); @@ -629,18 +621,18 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_d= ev *dev, nprps =3D DIV_ROUND_UP(length, NVME_CTRL_PAGE_SIZE); if (nprps <=3D (256 / 8)) { pool =3D dev->prp_small_pool; - iod->nr_allocations =3D 0; + iod->nr_descriptors =3D 0; } else { pool =3D dev->prp_page_pool; - iod->nr_allocations =3D 1; + iod->nr_descriptors =3D 1; } =20 prp_list =3D dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma); if (!prp_list) { - iod->nr_allocations =3D -1; + iod->nr_descriptors =3D -1; return BLK_STS_RESOURCE; } - iod->list[0].prp_list =3D prp_list; + iod->descriptors[0] =3D prp_list; iod->first_dma =3D prp_dma; i =3D 0; for (;;) { @@ -649,7 +641,7 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_dev= *dev, prp_list =3D dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma); if (!prp_list) goto free_prps; - iod->list[iod->nr_allocations++].prp_list =3D prp_list; + iod->descriptors[iod->nr_descriptors++] =3D prp_list; prp_list[0] =3D old_prp_list[i - 1]; old_prp_list[i - 1] =3D cpu_to_le64(prp_dma); i =3D 1; @@ -719,19 +711,19 @@ static blk_status_t nvme_pci_setup_sgls(struct nvme_d= ev *dev, =20 if (entries <=3D (256 / sizeof(struct nvme_sgl_desc))) { pool =3D dev->prp_small_pool; - iod->nr_allocations =3D 0; + iod->nr_descriptors =3D 0; } else { pool =3D dev->prp_page_pool; - iod->nr_allocations =3D 1; + iod->nr_descriptors =3D 1; } =20 sg_list =3D dma_pool_alloc(pool, GFP_ATOMIC, &sgl_dma); if (!sg_list) { - iod->nr_allocations =3D -1; + iod->nr_descriptors =3D -1; return BLK_STS_RESOURCE; } =20 - iod->list[0].sg_list =3D sg_list; + iod->descriptors[0] =3D sg_list; iod->first_dma =3D sgl_dma; =20 nvme_pci_sgl_set_seg(&cmd->dptr.sgl, sgl_dma, entries); @@ -870,7 +862,7 @@ static blk_status_t nvme_pci_setup_meta_sgls(struct nvm= e_dev *dev, goto out_unmap_sg; =20 entries =3D iod->meta_sgt.nents; - iod->meta_list.sg_list =3D sg_list; + iod->meta_list =3D sg_list; iod->meta_dma =3D sgl_dma; =20 cmnd->flags =3D NVME_CMD_SGL_METASEG; @@ -923,7 +915,7 @@ static blk_status_t nvme_prep_rq(struct nvme_dev *dev, = struct request *req) blk_status_t ret; =20 iod->aborted =3D false; - iod->nr_allocations =3D -1; + iod->nr_descriptors =3D -1; iod->sgt.nents =3D 0; iod->meta_sgt.nents =3D 0; =20 @@ -1048,8 +1040,7 @@ static __always_inline void nvme_unmap_metadata(struc= t nvme_dev *dev, return; } =20 - dma_pool_free(dev->prp_small_pool, iod->meta_list.sg_list, - iod->meta_dma); + dma_pool_free(dev->prp_small_pool, iod->meta_list, iod->meta_dma); dma_unmap_sgtable(dev->dev, &iod->meta_sgt, rq_dma_dir(req), 0); mempool_free(iod->meta_sgt.sgl, dev->iod_meta_mempool); } @@ -3801,7 +3792,7 @@ static int __init nvme_init(void) BUILD_BUG_ON(IRQ_AFFINITY_MAX_SETS < 2); BUILD_BUG_ON(NVME_MAX_SEGS > SGES_PER_PAGE); BUILD_BUG_ON(sizeof(struct scatterlist) * NVME_MAX_SEGS > PAGE_SIZE); - BUILD_BUG_ON(nvme_pci_npages_prp() > NVME_MAX_NR_ALLOCATIONS); + BUILD_BUG_ON(nvme_pci_npages_prp() > NVME_MAX_NR_DESCRIPTORS); =20 return pci_register_driver(&nvme_driver); } --=20 2.49.0