ucs_status_t ucp_ep_create_stub(ucp_worker_h worker, uint64_t dest_uuid, const char *message, ucp_ep_h *ep_p) { ucs_status_t status; ucp_ep_op_t optype; ucp_ep_h ep = NULL; status = ucp_ep_new(worker, dest_uuid, "??", message, &ep); if (status != UCS_OK) { goto err; } for (optype = 0; optype < UCP_EP_OP_LAST; ++optype) { status = ucp_stub_ep_create(ep, optype, 0, NULL, &ep->uct_eps[optype]); if (status != UCS_OK) { goto err_destroy_uct_eps; } } *ep_p = ep; return UCS_OK; err_destroy_uct_eps: for (optype = 0; optype < UCP_EP_OP_LAST; ++optype) { if (ep->uct_eps[optype] != NULL) { uct_ep_destroy(ep->uct_eps[optype]); } } ucp_ep_delete(ep); err: return status; }
ucs_status_t ucp_ep_create_stub(ucp_worker_h worker, uint64_t dest_uuid, const char *message, ucp_ep_h *ep_p) { ucs_status_t status; ucp_ep_config_key_t key; ucp_ep_h ep = NULL; status = ucp_ep_new(worker, dest_uuid, "??", message, &ep); if (status != UCS_OK) { goto err; } /* all operations will use the first lane, which is a stub endpoint */ memset(&key, 0, sizeof(key)); key.rma_lane_map = 1; key.amo_lane_map = 1; key.reachable_md_map = 0; /* TODO */ key.am_lane = 0; key.rndv_lane = 0; key.wireup_msg_lane = 0; key.lanes[0] = UCP_NULL_RESOURCE; key.num_lanes = 1; memset(key.amo_lanes, UCP_NULL_LANE, sizeof(key.amo_lanes)); ep->cfg_index = ucp_worker_get_ep_config(worker, &key); ep->am_lane = 0; status = ucp_stub_ep_create(ep, &ep->uct_eps[0]); if (status != UCS_OK) { goto err_destroy_uct_eps; } *ep_p = ep; return UCS_OK; err_destroy_uct_eps: uct_ep_destroy(ep->uct_eps[0]); ucp_ep_delete(ep); err: return status; }
static ucs_status_t ucp_wireup_connect_lane(ucp_ep_h ep, ucp_lane_index_t lane, unsigned address_count, const ucp_address_entry_t *address_list, unsigned addr_index) { ucp_worker_h worker = ep->worker; ucp_rsc_index_t rsc_index = ucp_ep_get_rsc_index(ep, lane); uct_iface_attr_t *iface_attr = &worker->iface_attrs[rsc_index]; uct_ep_h new_uct_ep; ucs_status_t status; /* * if the selected transport can be connected directly to the remote * interface, just create a connected UCT endpoint. */ if ((iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) && ((ep->uct_eps[lane] == NULL) || ucp_stub_ep_test(ep->uct_eps[lane]))) { /* create an endpoint connected to the remote interface */ ucs_assert(address_list[addr_index].tl_addr_len > 0); status = uct_ep_create_connected(worker->ifaces[rsc_index], address_list[addr_index].dev_addr, address_list[addr_index].iface_addr, &new_uct_ep); if (status != UCS_OK) { return status; } /* If ep already exists, it's a stub, and we need to update its next_ep * instead of replacing it. */ if (ep->uct_eps[lane] == NULL) { ucs_trace("ep %p: assign uct_ep[%d]=%p", ep, lane, new_uct_ep); ep->uct_eps[lane] = new_uct_ep; } else { ucs_trace("ep %p: assign set stub_ep[%d]=%p next to %p", ep, lane, ep->uct_eps[lane], new_uct_ep); ucp_stub_ep_set_next_ep(ep->uct_eps[lane], new_uct_ep); ucp_stub_ep_remote_connected(ep->uct_eps[lane]); } return UCS_OK; } /* * create a stub endpoint which will start connection establishment * protocol using an auxiliary transport. */ if (iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_EP) { /* If ep already exists, it's a stub, and we need to start auxiliary * wireup on that stub. */ if (ep->uct_eps[lane] == NULL) { ucs_trace("ep %p: create stub_ep[%d]=%p", ep, lane, ep->uct_eps[lane]); status = ucp_stub_ep_create(ep, &ep->uct_eps[lane]); if (status != UCS_OK) { return status; } } ucs_trace("ep %p: connect stub_ep[%d]=%p", ep, lane, ep->uct_eps[lane]); return ucp_stub_ep_connect(ep->uct_eps[lane], ucp_ep_get_rsc_index(ep, lane), lane == ucp_ep_get_wireup_msg_lane(ep), address_count, address_list); } return UCS_ERR_UNREACHABLE; }