RDMA/rxe: Move qp cleanup code to rxe_qp_do_cleanup()
authorBob Pearson <rpearsonhpe@gmail.com>
Thu, 21 Apr 2022 01:40:37 +0000 (20:40 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 9 May 2022 12:03:45 +0000 (09:03 -0300)
Move the code from rxe_qp_destroy() to rxe_qp_do_cleanup().  This allows
flows holding references to qp to complete before the qp object is torn
down.

Link: https://lore.kernel.org/r/20220421014042.26985-5-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_loc.h
drivers/infiniband/sw/rxe/rxe_qp.c
drivers/infiniband/sw/rxe/rxe_verbs.c

index 18f3c5d..0e022ae 100644 (file)
@@ -114,7 +114,6 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr,
 int rxe_qp_to_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask);
 void rxe_qp_error(struct rxe_qp *qp);
 int rxe_qp_chk_destroy(struct rxe_qp *qp);
-void rxe_qp_destroy(struct rxe_qp *qp);
 void rxe_qp_cleanup(struct rxe_pool_elem *elem);
 
 static inline int qp_num(struct rxe_qp *qp)
index ff58f76..a801175 100644 (file)
@@ -765,9 +765,11 @@ int rxe_qp_chk_destroy(struct rxe_qp *qp)
        return 0;
 }
 
-/* called by the destroy qp verb */
-void rxe_qp_destroy(struct rxe_qp *qp)
+/* called when the last reference to the qp is dropped */
+static void rxe_qp_do_cleanup(struct work_struct *work)
 {
+       struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work);
+
        qp->valid = 0;
        qp->qp_timeout_jiffies = 0;
        rxe_cleanup_task(&qp->resp.task);
@@ -786,12 +788,6 @@ void rxe_qp_destroy(struct rxe_qp *qp)
                __rxe_do_task(&qp->comp.task);
                __rxe_do_task(&qp->req.task);
        }
-}
-
-/* called when the last reference to the qp is dropped */
-static void rxe_qp_do_cleanup(struct work_struct *work)
-{
-       struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work);
 
        if (qp->sq.queue)
                rxe_queue_cleanup(qp->sq.queue);
index 5282162..198afb0 100644 (file)
@@ -485,7 +485,6 @@ static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
        if (ret)
                return ret;
 
-       rxe_qp_destroy(qp);
        rxe_put(qp);
        return 0;
 }