}
/* 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);