/* called by the destroy qp verb */ void rxe_qp_destroy(struct rxe_qp *qp) { struct rxe_dev *rxe = to_rdev(qp->ibqp.device); qp->valid = 0; qp->qp_timeout_jiffies = 0; rxe_cleanup_task(&qp->resp.task); del_timer_sync(&qp->retrans_timer); del_timer_sync(&qp->rnr_nak_timer); rxe_cleanup_task(&qp->req.task); if (qp_type(qp) == IB_QPT_RC) rxe_cleanup_task(&qp->comp.task); /* flush out any receive wr's or pending requests */ __rxe_do_task(&qp->req.task); if (qp->sq.queue) { __rxe_do_task(&qp->comp.task); __rxe_do_task(&qp->req.task); } /* drain the output queue */ while (!list_empty(&qp->arbiter_list)) __rxe_do_task(&rxe->arbiter.task); }
/* called by the destroy qp verb */ void rxe_qp_destroy(struct rxe_qp *qp) { qp->valid = 0; qp->qp_timeout_jiffies = 0; rxe_cleanup_task(&qp->resp.task); del_timer_sync(&qp->retrans_timer); del_timer_sync(&qp->rnr_nak_timer); rxe_cleanup_task(&qp->req.task); if (qp_type(qp) == IB_QPT_RC) rxe_cleanup_task(&qp->comp.task); /* flush out any receive wr's or pending requests */ __rxe_do_task(&qp->req.task); if (qp->sq.queue) { __rxe_do_task(&qp->comp.task); __rxe_do_task(&qp->req.task); } }
/* free resources for a rxe device all objects created for this device must have been destroyed */ static void rxe_cleanup(struct rxe_dev *rxe) { rxe_cleanup_task(&rxe->arbiter.task); rxe_pool_cleanup(&rxe->uc_pool); rxe_pool_cleanup(&rxe->pd_pool); rxe_pool_cleanup(&rxe->ah_pool); rxe_pool_cleanup(&rxe->srq_pool); rxe_pool_cleanup(&rxe->qp_pool); rxe_pool_cleanup(&rxe->cq_pool); rxe_pool_cleanup(&rxe->mr_pool); rxe_pool_cleanup(&rxe->fmr_pool); rxe_pool_cleanup(&rxe->mw_pool); rxe_pool_cleanup(&rxe->mc_grp_pool); rxe_pool_cleanup(&rxe->mc_elem_pool); rxe_cleanup_ports(rxe); }