Commit a246aa2e authored by Bob Pearson's avatar Bob Pearson Committed by Jason Gunthorpe

RDMA/rxe: Remove qp reference counting in tasks

Currently each of the three tasklets requester, completer and responder in
the rxe driver take and release a reference to the qp argument at the
beginning and end of the subroutines. The caller passing in the qp
argument should be responsible for holding a reference to qp so these are
not required. Further doing so breaks the qp cleanup code in
rxe_qp_do_cleanup which calls these routines after all the references have
been dropped so they cannot drain the packet and work request queues as
intended.

In fact if these routines are deferred by calling tasklet_schedule there
is no guarantee that the calling code does have a qp reference.  That is a
bug in rxe_task.c which will be fixed later in this series.

Link: https://lore.kernel.org/r/20230304174533.11296-6-rpearsonhpe@gmail.comSigned-off-by: default avatarBob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent fbdeb828
......@@ -619,9 +619,6 @@ int rxe_completer(struct rxe_qp *qp)
enum comp_state state;
int ret;
if (!rxe_get(qp))
return -EAGAIN;
if (!qp->valid || qp->comp.state == QP_STATE_ERROR ||
qp->comp.state == QP_STATE_RESET) {
bool notify = qp->valid &&
......@@ -824,7 +821,5 @@ int rxe_completer(struct rxe_qp *qp)
out:
if (pkt)
free_pkt(pkt);
rxe_put(qp);
return ret;
}
......@@ -653,9 +653,6 @@ int rxe_requester(struct rxe_qp *qp)
struct rxe_ah *ah;
struct rxe_av *av;
if (!rxe_get(qp))
return -EAGAIN;
if (unlikely(!qp->valid))
goto exit;
......@@ -844,7 +841,5 @@ int rxe_requester(struct rxe_qp *qp)
exit:
ret = -EAGAIN;
out:
rxe_put(qp);
return ret;
}
......@@ -1464,9 +1464,6 @@ int rxe_responder(struct rxe_qp *qp)
struct rxe_pkt_info *pkt = NULL;
int ret;
if (!rxe_get(qp))
return -EAGAIN;
if (!qp->valid || qp->resp.state == QP_STATE_ERROR ||
qp->resp.state == QP_STATE_RESET) {
bool notify = qp->valid &&
......@@ -1658,6 +1655,5 @@ int rxe_responder(struct rxe_qp *qp)
exit:
ret = -EAGAIN;
out:
rxe_put(qp);
return ret;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment