static void ucp_check_unavailable_devices(const str_names_array_t *devices, uint64_t *masks) { int dev_type_idx, i; /* Go over the devices lists and check which devices were marked as unavailable */ for (dev_type_idx = 0; dev_type_idx < UCT_DEVICE_TYPE_LAST; dev_type_idx++) { for (i = 0; i < devices[dev_type_idx].count; i++) { if (!(masks[dev_type_idx] & UCS_BIT(i))) { ucs_info("Device %s is not available", devices[dev_type_idx].names[i]); } } } }
static int ucp_is_resource_in_device_list(uct_tl_resource_desc_t *resource, const str_names_array_t *devices, uint64_t *masks, int index) { int device_enabled, config_idx; if (devices[index].count == 0) { return 0; } if (!strcmp(devices[index].names[0], "all")) { /* if the user's list is 'all', use all the available resources */ device_enabled = 1; masks[index] = -1; /* using all available devices. can satisfy 'all' */ } else { /* go over the device list from the user and check (against the available resources) * which can be satisfied */ device_enabled = 0; ucs_assert_always(devices[index].count <= 64); /* Using uint64_t bitmap */ config_idx = ucp_str_array_search((const char**)devices[index].names, devices[index].count, resource->dev_name); if (config_idx >= 0) { device_enabled = 1; masks[index] |= UCS_BIT(config_idx); } } /* Disable the posix mmap and xpmem 'devices'. ONLY for now - use sysv for mm . * This will be removed after multi-rail is supported */ if ((!strcmp(resource->dev_name,"posix") || !strcmp(resource->dev_name, "xpmem")) && (device_enabled)) { device_enabled = 0; ucs_info("posix and xpmem are currently unavailable"); } return device_enabled; }
static ucs_status_t uct_ugni_md_open(const char *md_name, const uct_md_config_t *md_config, uct_md_h *md_p) { int domain_id; ucs_status_t status = UCS_OK; pthread_mutex_lock(&uct_ugni_global_lock); static uct_md_ops_t md_ops = { .close = uct_ugni_md_close, .query = uct_ugni_md_query, .mem_alloc = (void*)ucs_empty_function, .mem_free = (void*)ucs_empty_function, .mem_reg = uct_ugni_mem_reg, .mem_dereg = uct_ugni_mem_dereg, .mkey_pack = uct_ugni_rkey_pack }; static uct_ugni_md_t md = { .super.ops = &md_ops, .super.component = &uct_ugni_md_component, .ref_count = 0 }; *md_p = &md.super; if (!md.ref_count) { status = init_device_list(&job_info); if (UCS_OK != status) { ucs_error("Failed to init device list, Error status: %d", status); goto error; } status = uct_ugni_init_nic(0, &domain_id, &md.cdm_handle, &md.nic_handle, &md.address); if (UCS_OK != status) { ucs_error("Failed to UGNI NIC, Error status: %d", status); goto error; } } md.ref_count++; error: pthread_mutex_unlock(&uct_ugni_global_lock); return status; } uct_ugni_device_t * uct_ugni_device_by_name(const char *dev_name) { uct_ugni_device_t *dev; unsigned dev_index; if ((NULL == dev_name)) { ucs_error("Bad parameter. Device name is set to NULL"); return NULL; } for (dev_index = 0; dev_index < job_info.num_devices; ++dev_index) { dev = &job_info.devices[dev_index]; if ((strlen(dev_name) == strlen(dev->fname)) && (0 == strncmp(dev_name, dev->fname, strlen(dev->fname)))) { ucs_info("Device found: %s", dev_name); return dev; } } /* Device not found */ ucs_error("Cannot find: %s", dev_name); return NULL; } UCT_MD_COMPONENT_DEFINE(uct_ugni_md_component, UCT_UGNI_MD_NAME, uct_ugni_query_md_resources, uct_ugni_md_open, NULL, uct_ugni_rkey_unpack, uct_ugni_rkey_release, "UGNI_", uct_md_config_table, uct_md_config_t);