]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/rxe: Remove rxe_alloc()
authorBob Pearson <rpearsonhpe@gmail.com>
Mon, 13 Feb 2023 22:55:52 +0000 (16:55 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 May 2023 11:58:41 +0000 (13:58 +0200)
[ Upstream commit 72a03627443d5bc7032ab98bd784740cd8a76f8a ]

Currently all the object types in the rxe driver are allocated in
rdma-core except for MRs. By moving tha kzalloc() call outside of
the pool code the rxe_alloc() subroutine can be eliminated and code
checking for MR as a special case can be removed.

This patch moves the kzalloc() and kfree_rcu() calls into the mr
registration and destruction verbs. It removes that code from
rxe_pool.c including the rxe_alloc() subroutine which is no longer
used.

Link: https://lore.kernel.org/r/20230213225551.12437-1-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Reviewed-by: Devesh Sharma <devesh.s.sharma@oracle.com>
Reviewed-by: Devesh Sharma <devesh.s.sharma@oracle.com>
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Stable-dep-of: 78b26a335310 ("RDMA/rxe: Remove tasklet call from rxe_cq.c")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/sw/rxe/rxe_mr.c
drivers/infiniband/sw/rxe/rxe_pool.c
drivers/infiniband/sw/rxe/rxe_pool.h
drivers/infiniband/sw/rxe/rxe_verbs.c

index 5e9a03831bf9f2d3ec8fb54ec710cf25e0d7c828..b10aa1580a644accee0eaa316d5499b4bc8f2ad8 100644 (file)
@@ -731,7 +731,7 @@ int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
                return -EINVAL;
 
        rxe_cleanup(mr);
-
+       kfree_rcu(mr);
        return 0;
 }
 
index 1151c0b5cceaba60311d4ce91da85c69c7701eee..6215c6de3a8408b9b9a304a1e1efa07f9d1a3630 100644 (file)
@@ -116,55 +116,12 @@ void rxe_pool_cleanup(struct rxe_pool *pool)
        WARN_ON(!xa_empty(&pool->xa));
 }
 
-void *rxe_alloc(struct rxe_pool *pool)
-{
-       struct rxe_pool_elem *elem;
-       void *obj;
-       int err;
-
-       if (WARN_ON(!(pool->type == RXE_TYPE_MR)))
-               return NULL;
-
-       if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
-               goto err_cnt;
-
-       obj = kzalloc(pool->elem_size, GFP_KERNEL);
-       if (!obj)
-               goto err_cnt;
-
-       elem = (struct rxe_pool_elem *)((u8 *)obj + pool->elem_offset);
-
-       elem->pool = pool;
-       elem->obj = obj;
-       kref_init(&elem->ref_cnt);
-       init_completion(&elem->complete);
-
-       /* allocate index in array but leave pointer as NULL so it
-        * can't be looked up until rxe_finalize() is called
-        */
-       err = xa_alloc_cyclic(&pool->xa, &elem->index, NULL, pool->limit,
-                             &pool->next, GFP_KERNEL);
-       if (err < 0)
-               goto err_free;
-
-       return obj;
-
-err_free:
-       kfree(obj);
-err_cnt:
-       atomic_dec(&pool->num_elem);
-       return NULL;
-}
-
 int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
                                bool sleepable)
 {
        int err;
        gfp_t gfp_flags;
 
-       if (WARN_ON(pool->type == RXE_TYPE_MR))
-               return -EINVAL;
-
        if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
                goto err_cnt;
 
@@ -275,9 +232,6 @@ int __rxe_cleanup(struct rxe_pool_elem *elem, bool sleepable)
        if (pool->cleanup)
                pool->cleanup(elem);
 
-       if (pool->type == RXE_TYPE_MR)
-               kfree_rcu(elem->obj);
-
        atomic_dec(&pool->num_elem);
 
        return err;
index 9d83cb32092ffdd61bf62bc35367f1388abbf972..b42e26427a702924d01c780102b1a9a8dfdb594a 100644 (file)
@@ -54,9 +54,6 @@ void rxe_pool_init(struct rxe_dev *rxe, struct rxe_pool *pool,
 /* free resources from object pool */
 void rxe_pool_cleanup(struct rxe_pool *pool);
 
-/* allocate an object from pool */
-void *rxe_alloc(struct rxe_pool *pool);
-
 /* connect already allocated object to pool */
 int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
                                bool sleepable);
index 9ae7cf93365c7024ffa230767c0a9854a6a01ef8..6803ac76ae57253ba1acbe2f1140329a7ab760da 100644 (file)
@@ -867,10 +867,17 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
        struct rxe_dev *rxe = to_rdev(ibpd->device);
        struct rxe_pd *pd = to_rpd(ibpd);
        struct rxe_mr *mr;
+       int err;
 
-       mr = rxe_alloc(&rxe->mr_pool);
-       if (!mr)
-               return ERR_PTR(-ENOMEM);
+       mr = kzalloc(sizeof(*mr), GFP_KERNEL);
+       if (!mr) {
+               err = -ENOMEM;
+               goto err_out;
+       }
+
+       err = rxe_add_to_pool(&rxe->mr_pool, mr);
+       if (err)
+               goto err_free;
 
        rxe_get(pd);
        mr->ibmr.pd = ibpd;
@@ -878,8 +885,12 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 
        rxe_mr_init_dma(access, mr);
        rxe_finalize(mr);
-
        return &mr->ibmr;
+
+err_free:
+       kfree(mr);
+err_out:
+       return ERR_PTR(err);
 }
 
 static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
@@ -893,9 +904,15 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
        struct rxe_pd *pd = to_rpd(ibpd);
        struct rxe_mr *mr;
 
-       mr = rxe_alloc(&rxe->mr_pool);
-       if (!mr)
-               return ERR_PTR(-ENOMEM);
+       mr = kzalloc(sizeof(*mr), GFP_KERNEL);
+       if (!mr) {
+               err = -ENOMEM;
+               goto err_out;
+       }
+
+       err = rxe_add_to_pool(&rxe->mr_pool, mr);
+       if (err)
+               goto err_free;
 
        rxe_get(pd);
        mr->ibmr.pd = ibpd;
@@ -903,14 +920,16 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
 
        err = rxe_mr_init_user(rxe, start, length, iova, access, mr);
        if (err)
-               goto err1;
+               goto err_cleanup;
 
        rxe_finalize(mr);
-
        return &mr->ibmr;
 
-err1:
+err_cleanup:
        rxe_cleanup(mr);
+err_free:
+       kfree(mr);
+err_out:
        return ERR_PTR(err);
 }
 
@@ -925,9 +944,15 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
        if (mr_type != IB_MR_TYPE_MEM_REG)
                return ERR_PTR(-EINVAL);
 
-       mr = rxe_alloc(&rxe->mr_pool);
-       if (!mr)
-               return ERR_PTR(-ENOMEM);
+       mr = kzalloc(sizeof(*mr), GFP_KERNEL);
+       if (!mr) {
+               err = -ENOMEM;
+               goto err_out;
+       }
+
+       err = rxe_add_to_pool(&rxe->mr_pool, mr);
+       if (err)
+               goto err_free;
 
        rxe_get(pd);
        mr->ibmr.pd = ibpd;
@@ -935,14 +960,16 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 
        err = rxe_mr_init_fast(max_num_sg, mr);
        if (err)
-               goto err1;
+               goto err_cleanup;
 
        rxe_finalize(mr);
-
        return &mr->ibmr;
 
-err1:
+err_cleanup:
        rxe_cleanup(mr);
+err_free:
+       kfree(mr);
+err_out:
        return ERR_PTR(err);
 }