RDMA/rxe: Replace int num_qp by atomic_t qp_num
authorBob Pearson <rpearsonhpe@gmail.com>
Tue, 8 Feb 2022 21:16:38 +0000 (15:16 -0600)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 16 Feb 2022 16:01:22 +0000 (12:01 -0400)
Replace int num_qp in struct rxe_mcg by atomic_t qp_num.

Link: https://lore.kernel.org/r/20220208211644.123457-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_mcast.c
drivers/infiniband/sw/rxe/rxe_verbs.h

index ae8103e819d505aaa17ea60c71b6efed11b4a459..1995d24caa602c19c176dd00c851650eb9e2cbef 100644 (file)
@@ -111,7 +111,8 @@ static int rxe_attach_mcg(struct rxe_dev *rxe, struct rxe_qp *qp,
        }
 
        /* check limits after checking if already attached */
-       if (mcg->num_qp >= rxe->attr.max_mcast_qp_attach) {
+       if (atomic_inc_return(&mcg->qp_num) > rxe->attr.max_mcast_qp_attach) {
+               atomic_dec(&mcg->qp_num);
                kfree(mca);
                err = -ENOMEM;
                goto out;
@@ -122,7 +123,6 @@ static int rxe_attach_mcg(struct rxe_dev *rxe, struct rxe_qp *qp,
        mca->qp = qp;
 
        atomic_inc(&qp->mcg_num);
-       mcg->num_qp++;
        list_add(&mca->qp_list, &mcg->qp_list);
 
        err = 0;
@@ -182,8 +182,7 @@ static int rxe_detach_mcg(struct rxe_dev *rxe, struct rxe_qp *qp,
                         * object since we are still holding a ref
                         * from the get key above.
                         */
-                       mcg->num_qp--;
-                       if (mcg->num_qp <= 0)
+                       if (atomic_dec_return(&mcg->qp_num) <= 0)
                                __rxe_destroy_mcg(mcg);
 
                        atomic_dec(&qp->mcg_num);
@@ -222,7 +221,7 @@ int rxe_attach_mcast(struct ib_qp *ibqp, union ib_gid *mgid, u16 mlid)
        err = rxe_attach_mcg(rxe, qp, mcg);
 
        /* if we failed to attach the first qp to mcg tear it down */
-       if (mcg->num_qp == 0)
+       if (atomic_read(&mcg->qp_num) == 0)
                rxe_destroy_mcg(mcg);
 
        rxe_drop_ref(mcg);
index 1b0f4088189540ebe6cfd2c829b7d2c84395476a..3790163bb265526182195c654002431bb87a6737 100644 (file)
@@ -356,7 +356,7 @@ struct rxe_mcg {
        struct rxe_dev          *rxe;
        struct list_head        qp_list;
        union ib_gid            mgid;
-       int                     num_qp;
+       atomic_t                qp_num;
        u32                     qkey;
        u16                     pkey;
 };