Skip to content

Commit 3225717

Browse files
rpearsonhpe-designjgunthorpe
authored andcommitted
RDMA/rxe: Replace red-black trees by xarrays
Currently the rxe driver uses red-black trees to add indices to the rxe object pools. Linux xarrays provide a better way to implement the same functionality for indices. This patch replaces red-black trees by xarrays for pool objects. Since xarrays already have a spinlock use that in place of the pool rwlock. Make sure that all changes in the xarray(index) and kref(ref counnt) occur atomically. Link: https://lore.kernel.org/r/20220304000808.225811-9-rpearsonhpe@gmail.com Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1 parent df34dc9 commit 3225717

6 files changed

Lines changed: 85 additions & 280 deletions

File tree

drivers/infiniband/sw/rxe/rxe.c

Lines changed: 12 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -114,75 +114,26 @@ static void rxe_init_ports(struct rxe_dev *rxe)
114114
}
115115

116116
/* init pools of managed objects */
117-
static int rxe_init_pools(struct rxe_dev *rxe)
117+
static void rxe_init_pools(struct rxe_dev *rxe)
118118
{
119-
int err;
120-
121-
err = rxe_pool_init(rxe, &rxe->uc_pool, RXE_TYPE_UC);
122-
if (err)
123-
goto err1;
124-
125-
err = rxe_pool_init(rxe, &rxe->pd_pool, RXE_TYPE_PD);
126-
if (err)
127-
goto err2;
128-
129-
err = rxe_pool_init(rxe, &rxe->ah_pool, RXE_TYPE_AH);
130-
if (err)
131-
goto err3;
132-
133-
err = rxe_pool_init(rxe, &rxe->srq_pool, RXE_TYPE_SRQ);
134-
if (err)
135-
goto err4;
136-
137-
err = rxe_pool_init(rxe, &rxe->qp_pool, RXE_TYPE_QP);
138-
if (err)
139-
goto err5;
140-
141-
err = rxe_pool_init(rxe, &rxe->cq_pool, RXE_TYPE_CQ);
142-
if (err)
143-
goto err6;
144-
145-
err = rxe_pool_init(rxe, &rxe->mr_pool, RXE_TYPE_MR);
146-
if (err)
147-
goto err7;
148-
149-
err = rxe_pool_init(rxe, &rxe->mw_pool, RXE_TYPE_MW);
150-
if (err)
151-
goto err8;
152-
153-
return 0;
154-
155-
err8:
156-
rxe_pool_cleanup(&rxe->mr_pool);
157-
err7:
158-
rxe_pool_cleanup(&rxe->cq_pool);
159-
err6:
160-
rxe_pool_cleanup(&rxe->qp_pool);
161-
err5:
162-
rxe_pool_cleanup(&rxe->srq_pool);
163-
err4:
164-
rxe_pool_cleanup(&rxe->ah_pool);
165-
err3:
166-
rxe_pool_cleanup(&rxe->pd_pool);
167-
err2:
168-
rxe_pool_cleanup(&rxe->uc_pool);
169-
err1:
170-
return err;
119+
rxe_pool_init(rxe, &rxe->uc_pool, RXE_TYPE_UC);
120+
rxe_pool_init(rxe, &rxe->pd_pool, RXE_TYPE_PD);
121+
rxe_pool_init(rxe, &rxe->ah_pool, RXE_TYPE_AH);
122+
rxe_pool_init(rxe, &rxe->srq_pool, RXE_TYPE_SRQ);
123+
rxe_pool_init(rxe, &rxe->qp_pool, RXE_TYPE_QP);
124+
rxe_pool_init(rxe, &rxe->cq_pool, RXE_TYPE_CQ);
125+
rxe_pool_init(rxe, &rxe->mr_pool, RXE_TYPE_MR);
126+
rxe_pool_init(rxe, &rxe->mw_pool, RXE_TYPE_MW);
171127
}
172128

173129
/* initialize rxe device state */
174-
static int rxe_init(struct rxe_dev *rxe)
130+
static void rxe_init(struct rxe_dev *rxe)
175131
{
176-
int err;
177-
178132
/* init default device parameters */
179133
rxe_init_device_param(rxe);
180134

181135
rxe_init_ports(rxe);
182-
183-
err = rxe_init_pools(rxe);
184-
if (err)
185-
return err;
136+
rxe_init_pools(rxe);
186137

187138
/* init pending mmap list */
188139
spin_lock_init(&rxe->mmap_offset_lock);
@@ -194,8 +145,6 @@ static int rxe_init(struct rxe_dev *rxe)
194145
rxe->mcg_tree = RB_ROOT;
195146

196147
mutex_init(&rxe->usdev_lock);
197-
198-
return 0;
199148
}
200149

201150
void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
@@ -217,12 +166,7 @@ void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
217166
*/
218167
int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name)
219168
{
220-
int err;
221-
222-
err = rxe_init(rxe);
223-
if (err)
224-
return err;
225-
169+
rxe_init(rxe);
226170
rxe_set_mtu(rxe, mtu);
227171

228172
return rxe_register_device(rxe, ibdev_name);

drivers/infiniband/sw/rxe/rxe_mr.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,6 @@ int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
691691

692692
mr->state = RXE_MR_STATE_INVALID;
693693
rxe_drop_ref(mr_pd(mr));
694-
rxe_drop_index(mr);
695694
rxe_drop_ref(mr);
696695

697696
return 0;

drivers/infiniband/sw/rxe/rxe_mw.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ int rxe_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata)
2020
return ret;
2121
}
2222

23-
rxe_add_index(mw);
2423
mw->rkey = ibmw->rkey = (mw->elem.index << 8) | rxe_get_next_key(-1);
2524
mw->state = (mw->ibmw.type == IB_MW_TYPE_2) ?
2625
RXE_MW_STATE_FREE : RXE_MW_STATE_VALID;
@@ -329,10 +328,3 @@ struct rxe_mw *rxe_lookup_mw(struct rxe_qp *qp, int access, u32 rkey)
329328

330329
return mw;
331330
}
332-
333-
void rxe_mw_cleanup(struct rxe_pool_elem *elem)
334-
{
335-
struct rxe_mw *mw = container_of(elem, typeof(*mw), elem);
336-
337-
rxe_drop_index(mw);
338-
}

0 commit comments

Comments
 (0)