ucs_status_t uct_rc_verbs_ep_flush(uct_ep_h tl_ep, unsigned flags, uct_completion_t *comp) { uct_rc_verbs_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_rc_verbs_iface_t); uct_rc_verbs_ep_t *ep = ucs_derived_of(tl_ep, uct_rc_verbs_ep_t); ucs_status_t status; if (ucs_unlikely(flags & UCT_FLUSH_FLAG_CANCEL)) { uct_ep_pending_purge(&ep->super.super.super, NULL, 0); uct_rc_verbs_ep_handle_failure(ep, UCS_ERR_CANCELED); return UCS_OK; } status = uct_rc_ep_flush(&ep->super, iface->config.tx_max_wr, flags); if (status != UCS_INPROGRESS) { return status; } if (uct_rc_txqp_unsignaled(&ep->super.txqp) != 0) { status = uct_rc_verbs_ep_put_short(tl_ep, NULL, 0, 0, 0); if (status != UCS_OK) { return status; } } return uct_rc_txqp_add_flush_comp(&iface->super, &ep->super.super, &ep->super.txqp, comp, ep->txcnt.pi); }
ucs_status_t uct_dc_mlx5_ep_flush(uct_ep_h tl_ep, unsigned flags, uct_completion_t *comp) { uct_dc_mlx5_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_dc_mlx5_iface_t); uct_dc_mlx5_ep_t *ep = ucs_derived_of(tl_ep, uct_dc_mlx5_ep_t); ucs_status_t status; UCT_DC_MLX5_TXQP_DECL(txqp, txwq); if (ucs_unlikely(flags & UCT_FLUSH_FLAG_CANCEL)) { if (ep->dci != UCT_DC_MLX5_EP_NO_DCI) { uct_rc_txqp_purge_outstanding(&iface->tx.dcis[ep->dci].txqp, UCS_ERR_CANCELED, 0); #if ENABLE_ASSERT iface->tx.dcis[ep->dci].flags |= UCT_DC_DCI_FLAG_EP_CANCELED; #endif } uct_ep_pending_purge(tl_ep, NULL, 0); return UCS_OK; } if (!uct_rc_iface_has_tx_resources(&iface->super.super)) { return UCS_ERR_NO_RESOURCE; } if (ep->dci == UCT_DC_MLX5_EP_NO_DCI) { if (!uct_dc_mlx5_iface_dci_can_alloc(iface)) { return UCS_ERR_NO_RESOURCE; /* waiting for dci */ } else { UCT_TL_EP_STAT_FLUSH(&ep->super); /* no sends */ return UCS_OK; } } if (!uct_dc_mlx5_iface_dci_ep_can_send(ep)) { return UCS_ERR_NO_RESOURCE; /* cannot send */ } status = uct_dc_mlx5_iface_flush_dci(iface, ep->dci); if (status == UCS_OK) { UCT_TL_EP_STAT_FLUSH(&ep->super); return UCS_OK; /* all sends completed */ } ucs_assert(status == UCS_INPROGRESS); ucs_assert(ep->dci != UCT_DC_MLX5_EP_NO_DCI); UCT_DC_MLX5_IFACE_TXQP_GET(iface, ep, txqp, txwq); return uct_rc_txqp_add_flush_comp(&iface->super.super, &ep->super, txqp, comp, txwq->sig_pi); }
static void ucp_ep_destory_uct_eps(ucp_ep_h ep) { ucp_lane_index_t lane; uct_ep_h uct_ep; for (lane = 0; lane < ucp_ep_num_lanes(ep); ++lane) { uct_ep = ep->uct_eps[lane]; if (uct_ep == NULL) { continue; } uct_ep_pending_purge(uct_ep, ucp_request_release_pending_send, NULL); ucs_debug("destroy ep %p lane %d uct_ep %p", ep, lane, uct_ep); uct_ep_destroy(uct_ep); } }
static void ucp_ep_destory_uct_eps(ucp_ep_h ep) { uct_ep_h uct_ep; int optype; for (optype = 0; optype < UCP_EP_OP_LAST; ++optype) { if (!ucp_ep_is_op_primary(ep, optype)) { continue; } uct_ep = ep->uct_eps[optype]; uct_ep_pending_purge(uct_ep, ucp_ep_pending_req_release); ucs_debug("destroy ep %p op %d uct_ep %p", ep, optype, uct_ep); uct_ep_destroy(uct_ep); } }
void ucp_ep_destroy_internal(ucp_ep_h ep, const char *message) { ucp_lane_index_t lane; uct_ep_h uct_ep; ucs_debug("destroy ep %p%s", ep, message); for (lane = 0; lane < ucp_ep_num_lanes(ep); ++lane) { uct_ep = ep->uct_eps[lane]; if (uct_ep == NULL) { continue; } uct_ep_pending_purge(uct_ep, ucp_destroyed_ep_pending_purge, ep); ucs_debug("destroy ep %p lane[%d]=%p", ep, lane, uct_ep); uct_ep_destroy(uct_ep); } ucs_free(ep); }
void ucp_ep_destroy_uct_ep_safe(ucp_ep_h ep, uct_ep_h uct_ep) { ucs_assert_always(uct_ep != NULL); uct_ep_pending_purge(uct_ep, ucp_pending_req_release); uct_ep_destroy(uct_ep); }