static ucs_status_t ucp_address_gather_devices(ucp_worker_h worker, uint64_t tl_bitmap, int has_ep, ucp_address_packed_device_t **devices_p, ucp_rsc_index_t *num_devices_p) { ucp_context_h context = worker->context; ucp_address_packed_device_t *dev, *devices; uct_iface_attr_t *iface_attr; ucp_rsc_index_t num_devices; ucp_rsc_index_t i; uint64_t mask; devices = ucs_calloc(context->num_tls, sizeof(*devices), "packed_devices"); if (devices == NULL) { return UCS_ERR_NO_MEMORY; } num_devices = 0; for (i = 0; i < context->num_tls; ++i) { mask = UCS_BIT(i); if (!(mask & tl_bitmap)) { continue; } iface_attr = &worker->ifaces[i].attr; if (!(iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) && !(iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_EP)) { continue; } dev = ucp_address_get_device(context->tl_rscs[i].tl_rsc.dev_name, devices, &num_devices); dev->tl_addrs_size += iface_attr->iface_addr_len; if (!(iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) && has_ep) { /* ep address and its length */ dev->tl_addrs_size += 1 + iface_attr->ep_addr_len; } dev->tl_addrs_size += sizeof(uint16_t); /* tl name checksum */ dev->tl_addrs_size += sizeof(ucp_address_packed_iface_attr_t); /* iface attr */ dev->tl_addrs_size += 1; /* iface address length */ dev->rsc_index = i; dev->dev_addr_len = iface_attr->device_addr_len; dev->tl_bitmap |= mask; } *devices_p = devices; *num_devices_p = num_devices; return UCS_OK; }
static ucs_status_t ucp_address_gather_devices(ucp_worker_h worker, uint64_t tl_bitmap, int has_ep, ucp_address_packed_device_t **devices_p, ucp_rsc_index_t *num_devices_p) { ucp_context_h context = worker->context; ucp_address_packed_device_t *dev, *devices; uct_iface_attr_t *iface_attr; ucp_rsc_index_t num_devices; ucp_rsc_index_t i; uint64_t mask; devices = ucs_calloc(context->num_tls, sizeof(*devices), "packed_devices"); if (devices == NULL) { return UCS_ERR_NO_MEMORY; } num_devices = 0; for (i = 0; i < context->num_tls; ++i) { mask = UCS_BIT(i); if (!(mask & tl_bitmap)) { continue; } dev = ucp_address_get_device(context->tl_rscs[i].tl_rsc.dev_name, devices, &num_devices); iface_attr = &worker->iface_attrs[i]; if (iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) { dev->tl_addrs_size += iface_attr->iface_addr_len; } else if (iface_attr->cap.flags & UCT_IFACE_FLAG_CONNECT_TO_EP) { if (has_ep) { dev->tl_addrs_size += iface_attr->ep_addr_len; } else { /* Empty address */ } } else { continue; } dev->rsc_index = i; dev->dev_addr_len = iface_attr->device_addr_len; dev->tl_bitmap |= mask; dev->tl_addrs_size += 1; /* address length */ dev->tl_addrs_size += ucp_address_string_packed_size(context->tl_rscs[i].tl_rsc.tl_name); } *devices_p = devices; *num_devices_p = num_devices; return UCS_OK; }