static ucs_status_t ucp_add_tl_resources(ucp_context_h context, uct_pd_h pd, ucp_rsc_index_t pd_index, const ucp_config_t *config, unsigned *num_resources_p, uint64_t *masks) { uct_tl_resource_desc_t *tl_resources; ucp_tl_resource_desc_t *tmp; unsigned num_resources; ucs_status_t status; ucp_rsc_index_t i; *num_resources_p = 0; /* check what are the available uct resources */ status = uct_pd_query_tl_resources(pd, &tl_resources, &num_resources); if (status != UCS_OK) { ucs_error("Failed to query resources: %s", ucs_status_string(status)); goto err; } if (num_resources == 0) { ucs_debug("No tl resources found for pd %s", context->pd_rscs[pd_index].pd_name); goto out_free_resources; } tmp = ucs_realloc(context->tl_rscs, sizeof(*context->tl_rscs) * (context->num_tls + num_resources), "ucp resources"); if (tmp == NULL) { ucs_error("Failed to allocate resources"); status = UCS_ERR_NO_MEMORY; goto err_free_resources; } /* copy only the resources enabled by user configuration */ context->tl_rscs = tmp; for (i = 0; i < num_resources; ++i) { if (ucp_is_resource_enabled(&tl_resources[i], config, masks)) { context->tl_rscs[context->num_tls].tl_rsc = tl_resources[i]; context->tl_rscs[context->num_tls].pd_index = pd_index; ++context->num_tls; ++(*num_resources_p); } } out_free_resources: uct_release_tl_resource_list(tl_resources); return UCS_OK; err_free_resources: uct_release_tl_resource_list(tl_resources); err: return status; }
static ucs_status_t ucp_add_tl_resources(ucp_context_h context, uct_pd_h pd, ucp_rsc_index_t pd_index, const ucp_config_t *config, unsigned *num_resources_p) { uint64_t used_devices_mask, mask, config_devices_mask; uct_tl_resource_desc_t *tl_resources; ucp_tl_resource_desc_t *tmp; unsigned num_resources; ucs_status_t status; ucp_rsc_index_t i; *num_resources_p = 0; /* check what are the available uct resources */ status = uct_pd_query_tl_resources(pd, &tl_resources, &num_resources); if (status != UCS_OK) { ucs_error("Failed to query resources: %s", ucs_status_string(status)); goto err; } if (num_resources == 0) { ucs_debug("No tl resources found for pd %s", context->pd_rscs[pd_index].pd_name); goto out_free_resources; } tmp = ucs_realloc(context->tl_rscs, sizeof(*context->tl_rscs) * (context->num_tls + num_resources), "ucp resources"); if (tmp == NULL) { ucs_error("Failed to allocate resources"); status = UCS_ERR_NO_MEMORY; goto err_free_resources; } /* mask of all devices from configuration which were used */ used_devices_mask = 0; /* copy only the resources enabled by user configuration */ context->tl_rscs = tmp; for (i = 0; i < num_resources; ++i) { if (ucp_is_resource_enabled(&tl_resources[i], config, &mask)) { context->tl_rscs[context->num_tls].tl_rsc = tl_resources[i]; context->tl_rscs[context->num_tls].pd_index = pd_index; ++context->num_tls; used_devices_mask |= mask; ++(*num_resources_p); } } /* if all devices should be used, check that */ config_devices_mask = UCS_MASK_SAFE(config->devices.count); if (config->force_all_devices && (used_devices_mask != config_devices_mask)) { i = ucs_ffs64(used_devices_mask ^ config_devices_mask); ucs_error("device %s is not available", config->devices.names[i]); status = UCS_ERR_NO_DEVICE; goto err_free_resources; } out_free_resources: uct_release_tl_resource_list(tl_resources); return UCS_OK; err_free_resources: uct_release_tl_resource_list(tl_resources); err: return status; }