}
 
        /* 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;
        mca->qp = qp;
 
        atomic_inc(&qp->mcg_num);
-       mcg->num_qp++;
        list_add(&mca->qp_list, &mcg->qp_list);
 
        err = 0;
                         * 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);
        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);