Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
			}
	}
Exemplo n.º 3
0
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;
}