int siw_dealloc_pd(struct ib_pd *ofa_pd) { struct siw_pd *pd = siw_pd_ofa2siw(ofa_pd); struct siw_dev *sdev = siw_dev_ofa2siw(ofa_pd->device); siw_remove_obj(&sdev->idr_lock, &sdev->pd_idr, &pd->hdr); siw_pd_put(pd); return 0; }
/* * siw_dereg_mr() * * Release Memory Region. * * TODO: Update function if Memory Windows are supported by siw: * Is OFED core checking for MW dependencies for current * MR before calling MR deregistration?. * * @ofa_mr: OFA MR contained in siw MR. */ int siw_dereg_mr(struct ib_mr *ofa_mr) { struct siw_mr *mr; struct siw_dev *sdev = siw_dev_ofa2siw(ofa_mr->device); mr = siw_mr_ofa2siw(ofa_mr); dprint(DBG_OBJ|DBG_MM, "(MEM%d): Release UMem %p, #ref's: %d\n", mr->mem.hdr.id, mr->umem, atomic_read(&mr->mem.hdr.ref.refcount)); mr->mem.stag_state = STAG_INVALID; siw_pd_put(mr->pd); siw_remove_obj(&sdev->idr_lock, &sdev->mem_idr, &mr->mem.hdr); siw_mem_put(&mr->mem); return 0; }
int siw_destroy_qp(struct ib_qp *ofa_qp) { struct siw_qp *qp = siw_qp_ofa2siw(ofa_qp); struct siw_qp_attrs qp_attrs; dprint(DBG_CM, "(QP%d): SIW QP state=%d, cep=0x%p\n", QP_ID(qp), qp->attrs.state, qp->cep); /* * Mark QP as in process of destruction to prevent from eventual async * callbacks to OFA core */ qp->attrs.flags |= SIW_QP_IN_DESTROY; qp->rx_ctx.rx_suspend = 1; down_write(&qp->state_lock); qp_attrs.state = SIW_QP_STATE_ERROR; (void)siw_qp_modify(qp, &qp_attrs, SIW_QP_ATTR_STATE); if (qp->cep) { siw_cep_put(qp->cep); qp->cep = NULL; } up_write(&qp->state_lock); if (qp->rx_ctx.crc_enabled) crypto_free_hash(qp->rx_ctx.mpa_crc_hd.tfm); if (qp->tx_ctx.crc_enabled) crypto_free_hash(qp->tx_ctx.mpa_crc_hd.tfm); /* Drop references */ siw_cq_put(qp->scq); siw_cq_put(qp->rcq); siw_pd_put(qp->pd); qp->scq = qp->rcq = NULL; siw_qp_put(qp); return 0; }
int siw_destroy_qp(struct ib_qp *ofa_qp) { struct siw_qp *qp = siw_qp_ofa2siw(ofa_qp); struct siw_qp_attrs qp_attrs; pr_debug(DBG_CM "(QP%d): SIW QP state=%d, cep=0x%p\n", QP_ID(qp), qp->attrs.state, qp->cep); /* * Mark QP as in process of destruction to prevent from eventual async * callbacks to OFA core */ qp->attrs.flags |= SIW_QP_IN_DESTROY; down_write(&qp->state_lock); qp_attrs.state = SIW_QP_STATE_ERROR; (void)siw_qp_modify(qp, &qp_attrs, SIW_QP_ATTR_STATE); if (qp->cep) { siw_cep_put(qp->cep); qp->cep = NULL; } up_write(&qp->state_lock); /* Drop references */ siw_cq_put(qp->scq); siw_cq_put(qp->rcq); siw_pd_put(qp->pd); qp->scq = qp->rcq = NULL; siw_qp_put(qp); return 0; }