nvme-pci: factor the iod mempool creation into a helper
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Nov 2022 08:41:41 +0000 (09:41 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Oct 2023 12:56:58 +0000 (14:56 +0200)
[ Upstream commit 081a7d958ce4b65f9aab6e70e65b0b2e0b92297c ]

Add a helper to create the iod mempool.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Tested-by Gerd Bayer <gbayer@linxu.ibm.com>
Stable-dep-of: dad651b2a44e ("nvme-pci: do not set the NUMA node of device if it has none")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/nvme/host/pci.c

index b30269f..6ab532c 100644 (file)
@@ -392,14 +392,6 @@ static int nvme_pci_npages_sgl(void)
                        NVME_CTRL_PAGE_SIZE);
 }
 
-static size_t nvme_pci_iod_alloc_size(void)
-{
-       size_t npages = max(nvme_pci_npages_prp(), nvme_pci_npages_sgl());
-
-       return sizeof(__le64 *) * npages +
-               sizeof(struct scatterlist) * NVME_MAX_SEGS;
-}
-
 static int nvme_admin_init_hctx(struct blk_mq_hw_ctx *hctx, void *data,
                                unsigned int hctx_idx)
 {
@@ -2775,6 +2767,22 @@ static void nvme_release_prp_pools(struct nvme_dev *dev)
        dma_pool_destroy(dev->prp_small_pool);
 }
 
+static int nvme_pci_alloc_iod_mempool(struct nvme_dev *dev)
+{
+       size_t npages = max(nvme_pci_npages_prp(), nvme_pci_npages_sgl());
+       size_t alloc_size = sizeof(__le64 *) * npages +
+                           sizeof(struct scatterlist) * NVME_MAX_SEGS;
+
+       WARN_ON_ONCE(alloc_size > PAGE_SIZE);
+       dev->iod_mempool = mempool_create_node(1,
+                       mempool_kmalloc, mempool_kfree,
+                       (void *)alloc_size, GFP_KERNEL,
+                       dev_to_node(dev->dev));
+       if (!dev->iod_mempool)
+               return -ENOMEM;
+       return 0;
+}
+
 static void nvme_free_tagset(struct nvme_dev *dev)
 {
        if (dev->tagset.tags)
@@ -3103,7 +3111,6 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        int node, result = -ENOMEM;
        struct nvme_dev *dev;
        unsigned long quirks = id->driver_data;
-       size_t alloc_size;
 
        node = dev_to_node(&pdev->dev);
        if (node == NUMA_NO_NODE)
@@ -3148,21 +3155,9 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                quirks |= NVME_QUIRK_SIMPLE_SUSPEND;
        }
 
-       /*
-        * Double check that our mempool alloc size will cover the biggest
-        * command we support.
-        */
-       alloc_size = nvme_pci_iod_alloc_size();
-       WARN_ON_ONCE(alloc_size > PAGE_SIZE);
-
-       dev->iod_mempool = mempool_create_node(1, mempool_kmalloc,
-                                               mempool_kfree,
-                                               (void *) alloc_size,
-                                               GFP_KERNEL, node);
-       if (!dev->iod_mempool) {
-               result = -ENOMEM;
+       result = nvme_pci_alloc_iod_mempool(dev);
+       if (result)
                goto release_pools;
-       }
 
        result = nvme_init_ctrl(&dev->ctrl, &pdev->dev, &nvme_pci_ctrl_ops,
                        quirks);