int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { struct fi_prov *prov; struct fi_info *tail, *cur; int ret; if (!init) fi_ini(); if (FI_VERSION_LT(fi_version(), version)) { FI_WARN(&core_prov, FI_LOG_CORE, "Requested version is newer than library\n"); return -FI_ENOSYS; } if (flags == FI_PROV_ATTR_ONLY) { return fi_getprovinfo(info); } *info = tail = NULL; for (prov = prov_head; prov; prov = prov->next) { if (!prov->provider->getinfo) continue; if (hints && hints->fabric_attr && hints->fabric_attr->prov_name && strcasecmp(prov->provider->name, hints->fabric_attr->prov_name)) continue; ret = prov->provider->getinfo(version, node, service, flags, hints, &cur); if (ret) { FI_WARN(&core_prov, FI_LOG_CORE, "fi_getinfo: provider %s returned -%d (%s)\n", prov->provider->name, -ret, fi_strerror(-ret)); continue; } if (!*info) *info = cur; else tail->next = cur; for (tail = cur; tail->next; tail = tail->next) { if (tail->fabric_attr->prov_name != NULL) FI_WARN(&core_prov, FI_LOG_CORE, "prov_name field is not NULL (%s)\n", tail->fabric_attr->prov_name); tail->fabric_attr->prov_name = strdup(prov->provider->name); tail->fabric_attr->prov_version = prov->provider->version; } if (tail->fabric_attr->prov_name != NULL) FI_WARN(&core_prov, FI_LOG_CORE, "prov_name field is not NULL (%s)\n", tail->fabric_attr->prov_name); tail->fabric_attr->prov_name = strdup(prov->provider->name); tail->fabric_attr->prov_version = prov->provider->version; } return *info ? 0 : -FI_ENODATA; }
int DEFAULT_SYMVER_PRE(fi_fabric)(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context) { struct fi_prov *prov; if (!attr || !attr->prov_name || !attr->name) return -FI_EINVAL; if (!init) fi_ini(); prov = fi_getprov(attr->prov_name); if (!prov || !prov->provider->fabric) return -FI_ENODEV; return prov->provider->fabric(attr, fabric, context); }
int DEFAULT_SYMVER_PRE(fi_fabric)(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context) { struct ofi_prov *prov; const char *top_name; int ret; if (!attr || !attr->prov_name || !attr->name) return -FI_EINVAL; if (!ofi_init) fi_ini(); top_name = strrchr(attr->prov_name, OFI_NAME_DELIM); if (top_name) top_name++; else top_name = attr->prov_name; if (!top_name) return -FI_EINVAL; prov = ofi_getprov(top_name, strlen(top_name)); if (!prov || !prov->provider || !prov->provider->fabric) return -FI_ENODEV; ret = prov->provider->fabric(attr, fabric, context); if (!ret) { if (FI_VERSION_GE(prov->provider->fi_version, FI_VERSION(1, 5))) (*fabric)->api_version = attr->api_version; FI_INFO(&core_prov, FI_LOG_CORE, "Opened fabric: %s\n", attr->name); ofi_hook_install(*fabric, fabric, prov->provider); } return ret; }
int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct fi_info **info) { struct ofi_prov *prov; struct fi_info *tail, *cur; char **prov_vec = NULL; size_t count = 0; int ret; if (!ofi_init) fi_ini(); if (FI_VERSION_LT(fi_version(), version)) { FI_WARN(&core_prov, FI_LOG_CORE, "Requested version is newer than library\n"); return -FI_ENOSYS; } if (flags == FI_PROV_ATTR_ONLY) { return ofi_getprovinfo(info); } if (hints && hints->fabric_attr && hints->fabric_attr->prov_name) { prov_vec = ofi_split_and_alloc(hints->fabric_attr->prov_name, ";", &count); if (!prov_vec) return -FI_ENOMEM; FI_DBG(&core_prov, FI_LOG_CORE, "hints prov_name: %s\n", hints->fabric_attr->prov_name); } *info = tail = NULL; for (prov = prov_head; prov; prov = prov->next) { if (!prov->provider) continue; if (!ofi_layering_ok(prov->provider, prov_vec, count, flags)) continue; if (FI_VERSION_LT(prov->provider->fi_version, version)) { FI_WARN(&core_prov, FI_LOG_CORE, "Provider %s fi_version %d.%d < requested %d.%d\n", prov->provider->name, FI_MAJOR(prov->provider->fi_version), FI_MINOR(prov->provider->fi_version), FI_MAJOR(version), FI_MINOR(version)); continue; } ret = prov->provider->getinfo(version, node, service, flags, hints, &cur); if (ret) { FI_WARN(&core_prov, FI_LOG_CORE, "fi_getinfo: provider %s returned -%d (%s)\n", prov->provider->name, -ret, fi_strerror(-ret)); continue; } if (!cur) { FI_WARN(&core_prov, FI_LOG_CORE, "fi_getinfo: provider %s output empty list\n", prov->provider->name); continue; } if (!*info) *info = cur; else tail->next = cur; for (tail = cur; tail->next; tail = tail->next) { ofi_set_prov_attr(tail->fabric_attr, prov->provider); tail->fabric_attr->api_version = version; } ofi_set_prov_attr(tail->fabric_attr, prov->provider); tail->fabric_attr->api_version = version; } ofi_free_string_array(prov_vec); return *info ? 0 : -FI_ENODATA; }