static void siw_free_qp(struct kref *ref) { struct siw_qp *qp = container_of(container_of(ref, struct siw_objhdr, ref), struct siw_qp, hdr); struct siw_dev *sdev = qp->hdr.sdev; pr_debug(DBG_OBJ DBG_CM "(QP%d): Free Object\n", QP_ID(qp)); if (qp->cep) siw_cep_put(qp->cep); siw_remove_obj(&sdev->idr_lock, &sdev->qp_idr, &qp->hdr); atomic_dec(&sdev->num_qp); kfree(qp); }
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; }
static void siw_free_qp(struct kref *ref) { struct siw_qp *qp = container_of(container_of(ref, struct siw_objhdr, ref), struct siw_qp, hdr); struct siw_dev *sdev = qp->hdr.sdev; unsigned long flags; dprint(DBG_OBJ|DBG_CM, "(QP%d): Free Object\n", QP_ID(qp)); if (qp->cep) siw_cep_put(qp->cep); siw_drain_wq(&qp->freeq); siw_remove_obj(&sdev->idr_lock, &sdev->qp_idr, &qp->hdr); spin_lock_irqsave(&sdev->idr_lock, flags); list_del(&qp->devq); spin_unlock_irqrestore(&sdev->idr_lock, flags); atomic_dec(&sdev->num_qp); kfree(qp); }
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; }