static int fi_ibv_get_matching_info(const char *domain_name, struct fi_info *hints, struct rdma_addrinfo *rai, struct fi_info **info) { struct fi_info *check_info; struct fi_info *fi, *tail; int ret; *info = tail = NULL; for (check_info = verbs_info; check_info; check_info = check_info->next) { if (domain_name && strncmp(check_info->domain_attr->name, domain_name, strlen(domain_name))) continue; if (hints) { ret = fi_ibv_check_hints(hints, check_info); if (ret) continue; } if (!(fi = fi_dupinfo(check_info))) { ret = -FI_ENOMEM; goto err1; } ret = fi_ibv_rai_to_fi(rai, fi); if (ret) goto err2; fi_ibv_update_info(hints, fi); if (!*info) *info = fi; else tail->next = fi; tail = fi; } if (!*info) return -FI_ENODATA; return 0; err2: fi_freeinfo(fi); err1: fi_freeinfo(*info); return ret; }
static int fi_ibv_get_srcaddr_devs(struct fi_info **info) { struct fi_info *fi, *add_info; struct fi_info *fi_unconf = NULL, *fi_prev = NULL; struct verbs_dev_info *dev; struct verbs_addr *addr; int ret = 0; DEFINE_LIST(verbs_devs); ret = fi_ibv_getifaddrs(&verbs_devs); if (ret) return ret; if (dlist_empty(&verbs_devs)) { VERBS_WARN(FI_LOG_CORE, "No interface address found\n"); return 0; } for (fi = *info; fi; fi = fi->next) { dlist_foreach_container(&verbs_devs, struct verbs_dev_info, dev, entry) if (!strncmp(fi->domain_attr->name, dev->name, strlen(dev->name))) { dlist_foreach_container(&dev->addrs, struct verbs_addr, addr, entry) { /* When a device has multiple interfaces/addresses configured * duplicate fi_info and add the address info. fi->src_addr * would have been set in the previous iteration */ if (fi->src_addr) { if (!(add_info = fi_dupinfo(fi))) { ret = -FI_ENOMEM; goto out; } add_info->next = fi->next; fi->next = add_info; fi = add_info; } ret = fi_ibv_rai_to_fi(addr->rai, fi); if (ret) goto out; } break; } }
static int fi_ibv_copy_ifaddr(const char *name, const char *service, uint64_t flags, struct fi_info *info) { struct rdma_addrinfo *rai; struct fi_info *fi; struct rdma_cm_id *id; int ret; ret = fi_ibv_get_rdma_rai(name, service, flags, NULL, &rai); if (ret) { FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "rdma_getaddrinfo failed for name:%s\n", name); return ret; } ret = rdma_create_ep(&id, rai, NULL, NULL); if (!ret) { for (fi = info; fi; fi = fi->next) if (!strncmp(id->verbs->device->name, fi->domain_attr->name, strlen(id->verbs->device->name))) break; if (!fi) { FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "No matching fi_info for device: " "%s with address: %s\n", id->verbs->device->name, name); } else { if (fi->src_addr) { free(fi->src_addr); fi->src_addr = NULL; } fi_ibv_rai_to_fi(rai, fi); } rdma_destroy_ep(id); } rdma_freeaddrinfo(rai); return 0; }