RDMA/srp: Fix a recently introduced memory leak
authorBart Van Assche <bvanassche@acm.org>
Mon, 24 May 2021 04:12:10 +0000 (21:12 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 28 May 2021 23:21:21 +0000 (20:21 -0300)
Only allocate a memory registration list if it will be used and if it will
be freed.

Link: https://lore.kernel.org/r/20210524041211.9480-5-bvanassche@acm.org
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
Fixes: f273ad4f8d90 ("RDMA/srp: Remove support for FMR memory registration")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/ulp/srp/ib_srp.c

index 0f66bf0..70107ab 100644 (file)
@@ -998,7 +998,6 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
        struct srp_device *srp_dev = target->srp_host->srp_dev;
        struct ib_device *ibdev = srp_dev->dev;
        struct srp_request *req;
-       void *mr_list;
        dma_addr_t dma_addr;
        int i, ret = -ENOMEM;
 
@@ -1009,12 +1008,12 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
 
        for (i = 0; i < target->req_ring_size; ++i) {
                req = &ch->req_ring[i];
-               mr_list = kmalloc_array(target->mr_per_cmd, sizeof(void *),
-                                       GFP_KERNEL);
-               if (!mr_list)
-                       goto out;
-               if (srp_dev->use_fast_reg)
-                       req->fr_list = mr_list;
+               if (srp_dev->use_fast_reg) {
+                       req->fr_list = kmalloc_array(target->mr_per_cmd,
+                                               sizeof(void *), GFP_KERNEL);
+                       if (!req->fr_list)
+                               goto out;
+               }
                req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);
                if (!req->indirect_desc)
                        goto out;