/* TODO: currently pending code supports only dcs policy support hash/random policies */ ucs_status_t uct_dc_mlx5_ep_pending_add(uct_ep_h tl_ep, uct_pending_req_t *r, unsigned flags) { 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); /* ep can tx iff * - iface has resources: cqe and tx skb * - dci is either assigned or can be assigned * - dci has resources */ if (uct_rc_iface_has_tx_resources(&iface->super.super)) { if (ep->dci == UCT_DC_MLX5_EP_NO_DCI) { if (uct_dc_mlx5_iface_dci_can_alloc(iface) && (ep->fc.fc_wnd > 0)) { return UCS_ERR_BUSY; } } else { if (uct_dc_mlx5_iface_dci_ep_can_send(ep)) { return UCS_ERR_BUSY; } } } UCS_STATIC_ASSERT(sizeof(uct_pending_req_priv_arb_t) <= UCT_PENDING_REQ_PRIV_LEN); uct_pending_req_arb_group_push(&ep->arb_group, r); /* no dci: * Do not grab dci here. Instead put the group on dci allocation arbiter. * This way we can assure fairness between all eps waiting for * dci allocation. Relevant for dcs and dcs_quota policies. */ if (ep->dci == UCT_DC_MLX5_EP_NO_DCI) { uct_dc_mlx5_iface_schedule_dci_alloc(iface, ep); UCT_TL_EP_STAT_PEND(&ep->super); return UCS_OK; } uct_dc_mlx5_iface_dci_sched_tx(iface, ep); UCT_TL_EP_STAT_PEND(&ep->super); return UCS_OK; }
ucs_status_t uct_ugni_ep_pending_add(uct_ep_h tl_ep, uct_pending_req_t *n, unsigned flags){ uct_ugni_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_ugni_iface_t); uct_ugni_ep_t *ep = ucs_derived_of(tl_ep, uct_ugni_ep_t); UCS_STATIC_ASSERT(sizeof(ucs_arbiter_elem_t) <= UCT_PENDING_REQ_PRIV_LEN); uct_ugni_enter_async(iface); uct_pending_req_arb_group_push(&ep->arb_group, n); ucs_arbiter_group_schedule(&iface->arbiter, &ep->arb_group); UCT_TL_EP_STAT_PEND(&ep->super); uct_ugni_leave_async(iface); return UCS_OK; }