RDMA/rxe: Add rxe_srq_cleanup()
authorBob Pearson <rpearsonhpe@gmail.com>
Thu, 21 Apr 2022 01:40:35 +0000 (20:40 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 9 May 2022 12:03:39 +0000 (09:03 -0300)
Move cleanup code from rxe_destroy_srq() to rxe_srq_cleanup() which is
called after all references are dropped to allow code depending on the srq
object to complete.

Link: https://lore.kernel.org/r/20220421014042.26985-3-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_pool.c
drivers/infiniband/sw/rxe/rxe_srq.c
drivers/infiniband/sw/rxe/rxe_verbs.c

index ff6cae2..18f3c5d 100644 (file)
@@ -37,7 +37,7 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited);
 
 void rxe_cq_disable(struct rxe_cq *cq);
 
-void rxe_cq_cleanup(struct rxe_pool_elem *arg);
+void rxe_cq_cleanup(struct rxe_pool_elem *elem);
 
 /* rxe_mcast.c */
 struct rxe_mcg *rxe_lookup_mcg(struct rxe_dev *rxe, union ib_gid *mgid);
@@ -81,7 +81,7 @@ int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
 int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
 int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
 int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
-void rxe_mr_cleanup(struct rxe_pool_elem *arg);
+void rxe_mr_cleanup(struct rxe_pool_elem *elem);
 
 /* rxe_mw.c */
 int rxe_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata);
@@ -89,7 +89,7 @@ int rxe_dealloc_mw(struct ib_mw *ibmw);
 int rxe_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
 int rxe_invalidate_mw(struct rxe_qp *qp, u32 rkey);
 struct rxe_mw *rxe_lookup_mw(struct rxe_qp *qp, int access, u32 rkey);
-void rxe_mw_cleanup(struct rxe_pool_elem *arg);
+void rxe_mw_cleanup(struct rxe_pool_elem *elem);
 
 /* rxe_net.c */
 struct sk_buff *rxe_init_packet(struct rxe_dev *rxe, struct rxe_av *av,
@@ -168,6 +168,7 @@ int rxe_srq_chk_attr(struct rxe_dev *rxe, struct rxe_srq *srq,
 int rxe_srq_from_attr(struct rxe_dev *rxe, struct rxe_srq *srq,
                      struct ib_srq_attr *attr, enum ib_srq_attr_mask mask,
                      struct rxe_modify_srq_cmd *ucmd, struct ib_udata *udata);
+void rxe_srq_cleanup(struct rxe_pool_elem *elem);
 
 void rxe_dealloc(struct ib_device *ib_dev);
 
index 8b1c4ff..8e6c4df 100644 (file)
@@ -45,6 +45,7 @@ static const struct rxe_type_info {
                .name           = "srq",
                .size           = sizeof(struct rxe_srq),
                .elem_offset    = offsetof(struct rxe_srq, elem),
+               .cleanup        = rxe_srq_cleanup,
                .min_index      = RXE_MIN_SRQ_INDEX,
                .max_index      = RXE_MAX_SRQ_INDEX,
                .max_elem       = RXE_MAX_SRQ_INDEX - RXE_MIN_SRQ_INDEX + 1,
index e2dcfc5..02b3949 100644 (file)
@@ -174,3 +174,14 @@ err2:
        srq->rq.queue = NULL;
        return err;
 }
+
+void rxe_srq_cleanup(struct rxe_pool_elem *elem)
+{
+       struct rxe_srq *srq = container_of(elem, typeof(*srq), elem);
+
+       if (srq->pd)
+               rxe_put(srq->pd);
+
+       if (srq->rq.queue)
+               rxe_queue_cleanup(srq->rq.queue);
+}
index 2ddfd99..5282162 100644 (file)
@@ -286,36 +286,34 @@ static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
        struct rxe_srq *srq = to_rsrq(ibsrq);
        struct rxe_create_srq_resp __user *uresp = NULL;
 
-       if (init->srq_type != IB_SRQT_BASIC)
-               return -EOPNOTSUPP;
-
        if (udata) {
                if (udata->outlen < sizeof(*uresp))
                        return -EINVAL;
                uresp = udata->outbuf;
        }
 
+       if (init->srq_type != IB_SRQT_BASIC)
+               return -EOPNOTSUPP;
+
        err = rxe_srq_chk_init(rxe, init);
        if (err)
-               goto err1;
+               return err;
 
        err = rxe_add_to_pool(&rxe->srq_pool, srq);
        if (err)
-               goto err1;
+               return err;
 
        rxe_get(pd);
        srq->pd = pd;
 
        err = rxe_srq_from_init(rxe, srq, init, udata, uresp);
        if (err)
-               goto err2;
+               goto err_put;
 
        return 0;
 
-err2:
-       rxe_put(pd);
+err_put:
        rxe_put(srq);
-err1:
        return err;
 }
 
@@ -339,16 +337,12 @@ static int rxe_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 
        err = rxe_srq_chk_attr(rxe, srq, attr, mask);
        if (err)
-               goto err1;
+               return err;
 
        err = rxe_srq_from_attr(rxe, srq, attr, mask, &ucmd, udata);
        if (err)
-               goto err1;
-
+               return err;
        return 0;
-
-err1:
-       return err;
 }
 
 static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
@@ -368,10 +362,6 @@ static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 {
        struct rxe_srq *srq = to_rsrq(ibsrq);
 
-       if (srq->rq.queue)
-               rxe_queue_cleanup(srq->rq.queue);
-
-       rxe_put(srq->pd);
        rxe_put(srq);
        return 0;
 }