nvme-pci: simplify nvme_dbbuf_dma_alloc
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Nov 2022 09:56:49 +0000 (10:56 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 15 Nov 2022 09:56:20 +0000 (10:56 +0100)
Move the OACS check and the error checking into nvme_dbbuf_dma_alloc so
that an upcoming second caller doesn't have to duplicate this boilerplate
code.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
drivers/nvme/host/pci.c

index c2e3a87237da82d67a96eb95df82706231098015..4da339690ec67a96c4553536d79fde7372267903 100644 (file)
@@ -239,10 +239,13 @@ static inline unsigned int nvme_dbbuf_size(struct nvme_dev *dev)
        return dev->nr_allocated_queues * 8 * dev->db_stride;
 }
 
-static int nvme_dbbuf_dma_alloc(struct nvme_dev *dev)
+static void nvme_dbbuf_dma_alloc(struct nvme_dev *dev)
 {
        unsigned int mem_size = nvme_dbbuf_size(dev);
 
+       if (!(dev->ctrl.oacs & NVME_CTRL_OACS_DBBUF_SUPP))
+               return;
+
        if (dev->dbbuf_dbs) {
                /*
                 * Clear the dbbuf memory so the driver doesn't observe stale
@@ -250,25 +253,27 @@ static int nvme_dbbuf_dma_alloc(struct nvme_dev *dev)
                 */
                memset(dev->dbbuf_dbs, 0, mem_size);
                memset(dev->dbbuf_eis, 0, mem_size);
-               return 0;
+               return;
        }
 
        dev->dbbuf_dbs = dma_alloc_coherent(dev->dev, mem_size,
                                            &dev->dbbuf_dbs_dma_addr,
                                            GFP_KERNEL);
        if (!dev->dbbuf_dbs)
-               return -ENOMEM;
+               goto fail;
        dev->dbbuf_eis = dma_alloc_coherent(dev->dev, mem_size,
                                            &dev->dbbuf_eis_dma_addr,
                                            GFP_KERNEL);
-       if (!dev->dbbuf_eis) {
-               dma_free_coherent(dev->dev, mem_size,
-                                 dev->dbbuf_dbs, dev->dbbuf_dbs_dma_addr);
-               dev->dbbuf_dbs = NULL;
-               return -ENOMEM;
-       }
+       if (!dev->dbbuf_eis)
+               goto fail_free_dbbuf_dbs;
+       return;
 
-       return 0;
+fail_free_dbbuf_dbs:
+       dma_free_coherent(dev->dev, mem_size, dev->dbbuf_dbs,
+                         dev->dbbuf_dbs_dma_addr);
+       dev->dbbuf_dbs = NULL;
+fail:
+       dev_warn(dev->dev, "unable to allocate dma for dbbuf\n");
 }
 
 static void nvme_dbbuf_dma_free(struct nvme_dev *dev)
@@ -2855,12 +2860,7 @@ static void nvme_reset_work(struct work_struct *work)
        if (result)
                goto out;
 
-       if (dev->ctrl.oacs & NVME_CTRL_OACS_DBBUF_SUPP) {
-               result = nvme_dbbuf_dma_alloc(dev);
-               if (result)
-                       dev_warn(dev->dev,
-                                "unable to allocate dma for dbbuf\n");
-       }
+       nvme_dbbuf_dma_alloc(dev);
 
        if (dev->ctrl.hmpre) {
                result = nvme_setup_host_mem(dev);