static void fi_tostr_fabric_attr(char *buf, const struct fi_fabric_attr *attr, const char *prefix) { if (!attr) { strcatf(buf, "%sfi_fabric_attr: (null)\n", prefix); return; } strcatf(buf, "%sfi_fabric_attr:\n", prefix); strcatf(buf, "%s%sname: %s\n", prefix, TAB, attr->name); strcatf(buf, "%s%sprov_name: %s\n", prefix, TAB, attr->prov_name); strcatf(buf, "%s%sprov_version: %d.%d\n", prefix, TAB, FI_MAJOR(attr->prov_version), FI_MINOR(attr->prov_version)); strcatf(buf, "%s%sapi_version: %d.%d\n", prefix, TAB, FI_MAJOR(attr->api_version), FI_MINOR(attr->api_version)); }
static int init(void) { int ret; print_trace("in\n"); print_info("kfabric/ibv provider initializing: version %d.%d.\n", FI_MAJOR(ibvp.version), FI_MINOR(ibvp.version)); ret = kfi_register_provider(ibvp.version, &ibvp); if (ret) { print_err("register returned %d for KFI %s provider\n", ret, ibvp.name); return ret; } // ret = init_driver(); if (ret) { print_err("init_driver returned %d for KFI %s provider\n", ret, ibvp.name); kfi_deregister_provider(&ibvp); return ret; } initialized++; print_dbg("KFI provider '%s' registered.\n", ibvp.name); print_info("kfabric/ibv provider loaded\n"); return 0; }
int print_short_info(struct fi_info *info) { for (struct fi_info *cur = info; cur; cur = cur->next) { printf("%s: %s\n", cur->fabric_attr->prov_name, cur->fabric_attr->name); printf(" version: %d.%d\n", FI_MAJOR(cur->fabric_attr->prov_version), FI_MINOR(cur->fabric_attr->prov_version)); printf(" type: %s\n", fi_tostr(&cur->ep_attr->type, FI_TYPE_EP_TYPE)); printf(" protocol: %s\n", fi_tostr(&cur->ep_attr->protocol, FI_TYPE_PROTOCOL)); } return EXIT_SUCCESS; }
static int print_providers(struct fi_info *info) { struct fi_info *cur; for (cur = info; cur; cur = cur->next) { printf("%s:\n", cur->fabric_attr->prov_name); printf(" version: %d.%d\n", FI_MAJOR(cur->fabric_attr->prov_version), FI_MINOR(cur->fabric_attr->prov_version)); } return EXIT_SUCCESS; }
static int print_short_info(struct fi_info *info) { struct fi_info *cur; for (cur = info; cur; cur = cur->next) { printf("provider: %s\n", cur->fabric_attr->prov_name); printf(" fabric: %s\n", cur->fabric_attr->name), printf(" domain: %s\n", cur->domain_attr->name), printf(" version: %d.%d\n", FI_MAJOR(cur->fabric_attr->prov_version), FI_MINOR(cur->fabric_attr->prov_version)); if (!list_providers) { printf(" type: %s\n", fi_tostr(&cur->ep_attr->type, FI_TYPE_EP_TYPE)); printf(" protocol: %s\n", fi_tostr(&cur->ep_attr->protocol, FI_TYPE_PROTOCOL)); } } return EXIT_SUCCESS; }
int fi_version_register(int version, struct fi_ops_prov *ops) { struct fi_prov *prov; if (FI_MAJOR(version) != FI_MAJOR_VERSION || FI_MINOR(version) > FI_MINOR_VERSION) return -FI_ENOSYS; prov = calloc(sizeof *prov, 1); if (!prov) return -FI_ENOMEM; prov->ops = ops; if (prov_tail) prov_tail->next = prov; else prov_head = prov; prov_tail = prov; return 0; }
static int fi_register_provider(struct fi_provider *provider, void *dlhandle) { struct fi_prov_context *ctx; struct fi_prov *prov; int ret; if (!provider) { ret = -FI_EINVAL; goto cleanup; } FI_INFO(&core_prov, FI_LOG_CORE, "registering provider: %s (%d.%d)\n", provider->name, FI_MAJOR(provider->version), FI_MINOR(provider->version)); /* The current core implementation is not backward compatible * with providers that support a release earlier than v1.3. * See commit 0f4b6651. */ if (provider->fi_version < FI_VERSION(1, 3)) { FI_INFO(&core_prov, FI_LOG_CORE, "provider has unsupported FI version " "(provider %d.%d != libfabric %d.%d); ignoring\n", FI_MAJOR(provider->fi_version), FI_MINOR(provider->fi_version), FI_MAJOR_VERSION, FI_MINOR_VERSION); ret = -FI_ENOSYS; goto cleanup; } if (fi_apply_filter(&prov_filter, provider->name)) { FI_INFO(&core_prov, FI_LOG_CORE, "\"%s\" filtered by provider include/exclude list, skipping\n", provider->name); ret = -FI_ENODEV; goto cleanup; } if (fi_apply_filter(&prov_log_filter, provider->name)) { ctx = (struct fi_prov_context *) &provider->context; ctx->disable_logging = 1; } prov = fi_getprov(provider->name); if (prov) { /* If this provider is older than an already-loaded * provider of the same name, then discard this one. */ if (FI_VERSION_GE(prov->provider->version, provider->version)) { FI_INFO(&core_prov, FI_LOG_CORE, "a newer %s provider was already loaded; " "ignoring this one\n", provider->name); ret = -FI_EALREADY; goto cleanup; } /* This provider is newer than an already-loaded * provider of the same name, so discard the * already-loaded one. */ FI_INFO(&core_prov, FI_LOG_CORE, "an older %s provider was already loaded; " "keeping this one and ignoring the older one\n", provider->name); cleanup_provider(prov->provider, prov->dlhandle); prov->dlhandle = dlhandle; prov->provider = provider; return 0; } prov = calloc(sizeof *prov, 1); if (!prov) { ret = -FI_ENOMEM; goto cleanup; } prov->dlhandle = dlhandle; prov->provider = provider; if (prov_tail) prov_tail->next = prov; else prov_head = prov; prov_tail = prov; return 0; cleanup: cleanup_provider(provider, dlhandle); 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; }
static int ofi_register_provider(struct fi_provider *provider, void *dlhandle) { struct fi_prov_context *ctx; struct ofi_prov *prov = NULL; int ret; if (!provider || !provider->name) { FI_WARN(&core_prov, FI_LOG_CORE, "no provider structure or name\n"); ret = -FI_EINVAL; goto cleanup; } FI_INFO(&core_prov, FI_LOG_CORE, "registering provider: %s (%d.%d)\n", provider->name, FI_MAJOR(provider->version), FI_MINOR(provider->version)); if (!provider->getinfo || !provider->fabric) { FI_WARN(&core_prov, FI_LOG_CORE, "provider missing mandatory entry points\n"); ret = -FI_EINVAL; goto cleanup; } /* The current core implementation is not backward compatible * with providers that support a release earlier than v1.3. * See commit 0f4b6651. */ if (provider->fi_version < FI_VERSION(1, 3)) { FI_INFO(&core_prov, FI_LOG_CORE, "provider has unsupported FI version " "(provider %d.%d != libfabric %d.%d); ignoring\n", FI_MAJOR(provider->fi_version), FI_MINOR(provider->fi_version), FI_MAJOR_VERSION, FI_MINOR_VERSION); ret = -FI_ENOSYS; goto cleanup; } ctx = (struct fi_prov_context *) &provider->context; ctx->is_util_prov = ofi_has_util_prefix(provider->name); if (ofi_getinfo_filter(provider)) { FI_INFO(&core_prov, FI_LOG_CORE, "\"%s\" filtered by provider include/exclude " "list, skipping\n", provider->name); ret = -FI_ENODEV; goto cleanup; } if (ofi_apply_filter(&prov_log_filter, provider->name)) ctx->disable_logging = 1; prov = ofi_getprov(provider->name, strlen(provider->name)); if (prov) { /* If this provider has not been init yet, then we add the * provider and dlhandle to the struct and exit. */ if (prov->provider == NULL) goto update_prov_registry; /* If this provider is older than an already-loaded * provider of the same name, then discard this one. */ if (FI_VERSION_GE(prov->provider->version, provider->version)) { FI_INFO(&core_prov, FI_LOG_CORE, "a newer %s provider was already loaded; " "ignoring this one\n", provider->name); ret = -FI_EALREADY; goto cleanup; } /* This provider is newer than an already-loaded * provider of the same name, so discard the * already-loaded one. */ FI_INFO(&core_prov, FI_LOG_CORE, "an older %s provider was already loaded; " "keeping this one and ignoring the older one\n", provider->name); cleanup_provider(prov->provider, prov->dlhandle); } else { prov = ofi_create_prov_entry(provider->name); if (!prov) { ret = -FI_EOTHER; goto cleanup; } } update_prov_registry: prov->dlhandle = dlhandle; prov->provider = provider; return 0; cleanup: cleanup_provider(provider, dlhandle); return ret; }