Skip to content

Commit 72a0362

Browse files
Bob Pearsonjgunthorpe
authored andcommitted
RDMA/rxe: Remove rxe_alloc()
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/[email protected] Signed-off-by: Bob Pearson <[email protected]> Reviewed-by: Devesh Sharma <[email protected]> Reviewed-by: Devesh Sharma <[email protected]> Reviewed-by: Zhu Yanjun <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 876e480 commit 72a0362

File tree

4 files changed

+44
-66
lines changed

4 files changed

+44
-66
lines changed

drivers/infiniband/sw/rxe/rxe_mr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
731731
return -EINVAL;
732732

733733
rxe_cleanup(mr);
734-
734+
kfree_rcu(mr);
735735
return 0;
736736
}
737737

drivers/infiniband/sw/rxe/rxe_pool.c

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -116,55 +116,12 @@ void rxe_pool_cleanup(struct rxe_pool *pool)
116116
WARN_ON(!xa_empty(&pool->xa));
117117
}
118118

119-
void *rxe_alloc(struct rxe_pool *pool)
120-
{
121-
struct rxe_pool_elem *elem;
122-
void *obj;
123-
int err;
124-
125-
if (WARN_ON(!(pool->type == RXE_TYPE_MR)))
126-
return NULL;
127-
128-
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
129-
goto err_cnt;
130-
131-
obj = kzalloc(pool->elem_size, GFP_KERNEL);
132-
if (!obj)
133-
goto err_cnt;
134-
135-
elem = (struct rxe_pool_elem *)((u8 *)obj + pool->elem_offset);
136-
137-
elem->pool = pool;
138-
elem->obj = obj;
139-
kref_init(&elem->ref_cnt);
140-
init_completion(&elem->complete);
141-
142-
/* allocate index in array but leave pointer as NULL so it
143-
* can't be looked up until rxe_finalize() is called
144-
*/
145-
err = xa_alloc_cyclic(&pool->xa, &elem->index, NULL, pool->limit,
146-
&pool->next, GFP_KERNEL);
147-
if (err < 0)
148-
goto err_free;
149-
150-
return obj;
151-
152-
err_free:
153-
kfree(obj);
154-
err_cnt:
155-
atomic_dec(&pool->num_elem);
156-
return NULL;
157-
}
158-
159119
int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
160120
bool sleepable)
161121
{
162122
int err;
163123
gfp_t gfp_flags;
164124

165-
if (WARN_ON(pool->type == RXE_TYPE_MR))
166-
return -EINVAL;
167-
168125
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
169126
goto err_cnt;
170127

@@ -275,9 +232,6 @@ int __rxe_cleanup(struct rxe_pool_elem *elem, bool sleepable)
275232
if (pool->cleanup)
276233
pool->cleanup(elem);
277234

278-
if (pool->type == RXE_TYPE_MR)
279-
kfree_rcu(elem->obj);
280-
281235
atomic_dec(&pool->num_elem);
282236

283237
return err;

drivers/infiniband/sw/rxe/rxe_pool.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ void rxe_pool_init(struct rxe_dev *rxe, struct rxe_pool *pool,
5454
/* free resources from object pool */
5555
void rxe_pool_cleanup(struct rxe_pool *pool);
5656

57-
/* allocate an object from pool */
58-
void *rxe_alloc(struct rxe_pool *pool);
59-
6057
/* connect already allocated object to pool */
6158
int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem,
6259
bool sleepable);

drivers/infiniband/sw/rxe/rxe_verbs.c

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -869,19 +869,30 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
869869
struct rxe_dev *rxe = to_rdev(ibpd->device);
870870
struct rxe_pd *pd = to_rpd(ibpd);
871871
struct rxe_mr *mr;
872+
int err;
872873

873-
mr = rxe_alloc(&rxe->mr_pool);
874-
if (!mr)
875-
return ERR_PTR(-ENOMEM);
874+
mr = kzalloc(sizeof(*mr), GFP_KERNEL);
875+
if (!mr) {
876+
err = -ENOMEM;
877+
goto err_out;
878+
}
879+
880+
err = rxe_add_to_pool(&rxe->mr_pool, mr);
881+
if (err)
882+
goto err_free;
876883

877884
rxe_get(pd);
878885
mr->ibmr.pd = ibpd;
879886
mr->ibmr.device = ibpd->device;
880887

881888
rxe_mr_init_dma(access, mr);
882889
rxe_finalize(mr);
883-
884890
return &mr->ibmr;
891+
892+
err_free:
893+
kfree(mr);
894+
err_out:
895+
return ERR_PTR(err);
885896
}
886897

887898
static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
@@ -895,24 +906,32 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
895906
struct rxe_pd *pd = to_rpd(ibpd);
896907
struct rxe_mr *mr;
897908

898-
mr = rxe_alloc(&rxe->mr_pool);
899-
if (!mr)
900-
return ERR_PTR(-ENOMEM);
909+
mr = kzalloc(sizeof(*mr), GFP_KERNEL);
910+
if (!mr) {
911+
err = -ENOMEM;
912+
goto err_out;
913+
}
914+
915+
err = rxe_add_to_pool(&rxe->mr_pool, mr);
916+
if (err)
917+
goto err_free;
901918

902919
rxe_get(pd);
903920
mr->ibmr.pd = ibpd;
904921
mr->ibmr.device = ibpd->device;
905922

906923
err = rxe_mr_init_user(rxe, start, length, iova, access, mr);
907924
if (err)
908-
goto err1;
925+
goto err_cleanup;
909926

910927
rxe_finalize(mr);
911-
912928
return &mr->ibmr;
913929

914-
err1:
930+
err_cleanup:
915931
rxe_cleanup(mr);
932+
err_free:
933+
kfree(mr);
934+
err_out:
916935
return ERR_PTR(err);
917936
}
918937

@@ -927,24 +946,32 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
927946
if (mr_type != IB_MR_TYPE_MEM_REG)
928947
return ERR_PTR(-EINVAL);
929948

930-
mr = rxe_alloc(&rxe->mr_pool);
931-
if (!mr)
932-
return ERR_PTR(-ENOMEM);
949+
mr = kzalloc(sizeof(*mr), GFP_KERNEL);
950+
if (!mr) {
951+
err = -ENOMEM;
952+
goto err_out;
953+
}
954+
955+
err = rxe_add_to_pool(&rxe->mr_pool, mr);
956+
if (err)
957+
goto err_free;
933958

934959
rxe_get(pd);
935960
mr->ibmr.pd = ibpd;
936961
mr->ibmr.device = ibpd->device;
937962

938963
err = rxe_mr_init_fast(max_num_sg, mr);
939964
if (err)
940-
goto err1;
965+
goto err_cleanup;
941966

942967
rxe_finalize(mr);
943-
944968
return &mr->ibmr;
945969

946-
err1:
970+
err_cleanup:
947971
rxe_cleanup(mr);
972+
err_free:
973+
kfree(mr);
974+
err_out:
948975
return ERR_PTR(err);
949976
}
950977

0 commit comments

Comments
 (0)