예제 #1
0
int ofi_nd_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fab,
		  void *context)
{
	OFI_UNUSED(context);

	if (attr) {
		if (attr->name && strcmp(attr->name, ofi_nd_prov.name))
			return -FI_EINVAL;
		if (attr->prov_name && strcmp(attr->prov_name, ofi_nd_prov.name))
			return -FI_EINVAL;
		if (attr->prov_version && attr->prov_version != ofi_nd_prov.version)
			return -FI_EINVAL;
	}

	struct nd_fabric *fabric = (struct nd_fabric*)calloc(1, sizeof(*fabric));
	if (!fabric)
		return -FI_ENOMEM;

	struct nd_fabric def = {
		.fid = {
			.fid = ofi_nd_fid,
			.ops = &ofi_nd_fabric_ops
		}
	};

	*fabric = def;

	*fab = &fabric->fid;

	fi_param_get_int(&ofi_nd_prov, "inlinethr", &gl_data.inline_thr);
	fi_param_get_int(&ofi_nd_prov, "prepostcnt", &gl_data.prepost_cnt);
	fi_param_get_int(&ofi_nd_prov, "prepostbuftcnt", &gl_data.prepost_buf_cnt);

	return FI_SUCCESS;
}
예제 #2
0
파일: rxd_init.c 프로젝트: ofiwg/libfabric
static void rxd_init_env(void)
{
	fi_param_get_int(&rxd_prov, "spin_count", &rxd_env.spin_count);
	fi_param_get_bool(&rxd_prov, "retry", &rxd_env.retry);
	fi_param_get_int(&rxd_prov, "max_peers", &rxd_env.max_peers);
	fi_param_get_int(&rxd_prov, "max_unacked", &rxd_env.max_unacked);
}
예제 #3
0
static void psmx2_init_env(void)
{
    if (getenv("OMPI_COMM_WORLD_RANK") || getenv("PMI_RANK"))
        psmx2_env.name_server = 0;

    fi_param_get_bool(&psmx2_prov, "name_server", &psmx2_env.name_server);
    fi_param_get_bool(&psmx2_prov, "tagged_rma", &psmx2_env.tagged_rma);
    fi_param_get_str(&psmx2_prov, "uuid", &psmx2_env.uuid);
    fi_param_get_int(&psmx2_prov, "delay", &psmx2_env.delay);
    fi_param_get_int(&psmx2_prov, "timeout", &psmx2_env.timeout);
    fi_param_get_int(&psmx2_prov, "prog_interval", &psmx2_env.prog_interval);
    fi_param_get_str(&psmx2_prov, "prog_affinity", &psmx2_env.prog_affinity);
}
예제 #4
0
static int fi_ibv_get_param_int(char *param_name, char *param_str,
				size_t *param_default)
{
	char *param_help;
	size_t len, ret;
	int param;

	len = strlen(param_str) + 50;
	param_help = malloc(len);

	ret = snprintf(param_help, len, "%s (default: %zu)", param_str,
		       *param_default);
	if (ret >= len) {
		VERBS_WARN(FI_LOG_EP_DATA,
			   "param_help string size insufficient!\n");
		free(param_help);
		assert(0);
		return -FI_ETOOSMALL;
	}

	fi_param_define(&fi_ibv_prov, param_name, FI_PARAM_INT, param_help);

	if (!fi_param_get_int(&fi_ibv_prov, param_name, &param))
		*param_default = param;

	free(param_help);
	return 0;
}
예제 #5
0
int rxd_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
		void *context)
{
	struct rxd_fabric *rxd_fabric;
	struct fi_info hints, *dg_info;
	int ret;

	rxd_fabric = calloc(1, sizeof(*rxd_fabric));
	if (!rxd_fabric)
		return -FI_ENOMEM;

	ret = ofi_fabric_init(&rxd_prov, &rxd_fabric_attr, attr,
			      &rxd_fabric->util_fabric, context);
	if (ret)
		goto err1;

	memset(&hints, 0, sizeof hints);
	if (!(hints.fabric_attr = calloc(1, sizeof(*hints.fabric_attr)))) {
		ret = -FI_ENOMEM;
		goto err2;
	}
	hints.fabric_attr->name = attr->name;

	ret = ofi_get_core_info(attr->api_version, NULL, NULL, 0, &rxd_util_prov,
				&hints, rxd_info_to_core, &dg_info);
	if (ret) {
		ret = -FI_EINVAL;
		goto err3;
	}

	ret = fi_fabric(dg_info->fabric_attr, &rxd_fabric->dg_fabric, context);
	if (ret) {
		goto err4;
	}

	*fabric = &rxd_fabric->util_fabric.fabric_fid;
	(*fabric)->fid.ops = &rxd_fabric_fi_ops;
	(*fabric)->ops = &rxd_fabric_ops;

	free(hints.fabric_attr);
	fi_freeinfo(dg_info);

	fi_param_get_int(&rxd_prov, "spin_count", &rxd_progress_spin_count);

	return 0;
err4:
	fi_freeinfo(dg_info);
err3:
	free(hints.fabric_attr);
err2:
	ofi_fabric_close(&rxd_fabric->util_fabric);
err1:
	free(rxd_fabric);
	return ret;
}
예제 #6
0
static int rxm_init_info(void)
{
	int param;

	if (!fi_param_get_int(&rxm_prov, "buffer_size", &param)) {
		if (param > sizeof(struct rxm_pkt)) {
			rxm_info.tx_attr->inject_size = param;
		} else {
			FI_WARN(&rxm_prov, FI_LOG_CORE,
				"Requested buffer size too small\n");
			return -FI_EINVAL;
		}
	} else {
		rxm_info.tx_attr->inject_size = RXM_BUF_SIZE;
	}
	rxm_info.tx_attr->inject_size -= sizeof(struct rxm_pkt);
	rxm_util_prov.info = &rxm_info;
	return 0;
}
예제 #7
0
static int fi_ibv_alloc_info(struct ibv_context *ctx, struct fi_info **info,
			     const struct verbs_ep_domain *ep_dom)
{
	struct fi_info *fi;
	union ibv_gid gid;
	size_t name_len;
	int ret;
	int param;

	if (!(fi = fi_allocinfo()))
		return -FI_ENOMEM;

	fi->caps		= ep_dom->caps;
	fi->handle		= NULL;
	if (ep_dom->type == FI_EP_RDM) {
		fi->mode	= VERBS_RDM_MODE;
		*(fi->tx_attr)	= verbs_rdm_tx_attr;
	} else {
		fi->mode	= VERBS_MODE;
		*(fi->tx_attr)	= verbs_tx_attr;
	}

	*(fi->rx_attr)		= (ep_dom->type == FI_EP_RDM)
				? verbs_rdm_rx_attr : verbs_rx_attr;
	*(fi->ep_attr)		= verbs_ep_attr;
	*(fi->domain_attr)	= verbs_domain_attr;
	*(fi->fabric_attr)	= verbs_fabric_attr;

	fi->ep_attr->type	= ep_dom->type;
	fi->tx_attr->caps	= ep_dom->caps;
	fi->rx_attr->caps	= ep_dom->caps;

	ret = fi_ibv_get_device_attrs(ctx, fi);
	if (ret)
		goto err;

	if (ep_dom->type == FI_EP_RDM) {
		fi->tx_attr->inject_size = FI_IBV_RDM_DFLT_BUFFERED_SSIZE;
		fi->tx_attr->iov_limit = 1;
		fi->tx_attr->rma_iov_limit = 1;
		if (!fi_param_get_int(&fi_ibv_prov, "rdm_buffer_size", &param)) {
			if (param > sizeof (struct fi_ibv_rdm_tagged_rndv_header)) {
				fi->tx_attr->inject_size = param;
			} else {
				FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
					"rdm_buffer_size too small, should be greater then %d\n",
					sizeof (struct fi_ibv_rdm_tagged_rndv_header));
				ret = -FI_EINVAL;
				goto err;
			}
		}
	}

	switch (ctx->device->transport_type) {
	case IBV_TRANSPORT_IB:
		if(ibv_query_gid(ctx, 1, 0, &gid)) {
			VERBS_INFO_ERRNO(FI_LOG_FABRIC, "ibv_query_gid", errno);
			ret = -errno;
			goto err;
		}

		name_len =  strlen(VERBS_IB_PREFIX) + INET6_ADDRSTRLEN;

		if (!(fi->fabric_attr->name = calloc(1, name_len + 1))) {
			ret = -FI_ENOMEM;
			goto err;
		}

		snprintf(fi->fabric_attr->name, name_len, VERBS_IB_PREFIX "%lx",
			 gid.global.subnet_prefix);

		fi->ep_attr->protocol = (ep_dom == &verbs_msg_domain) ?
					FI_PROTO_RDMA_CM_IB_RC : FI_PROTO_IB_RDM;
		break;
	case IBV_TRANSPORT_IWARP:
		fi->fabric_attr->name = strdup(VERBS_IWARP_FABRIC);
		if (!fi->fabric_attr->name) {
			ret = -FI_ENOMEM;
			goto err;
		}

		if (ep_dom == &verbs_msg_domain) {
			fi->ep_attr->protocol = FI_PROTO_IWARP;
			fi->tx_attr->op_flags = VERBS_TX_OP_FLAGS_IWARP;
		} else {
			fi->ep_attr->protocol = FI_PROTO_IWARP_RDM;
			fi->tx_attr->op_flags = VERBS_TX_OP_FLAGS_IWARP_RDM;
		}
		break;
	default:
		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unknown transport type\n");
		ret = -FI_ENODATA;
		goto err;
	}

	name_len = strlen(ctx->device->name) + strlen(ep_dom->suffix);
	fi->domain_attr->name = malloc(name_len + 1);
	if (!fi->domain_attr->name) {
		ret = -FI_ENOMEM;
		goto err;
	}

	snprintf(fi->domain_attr->name, name_len + 1, "%s%s",
		 ctx->device->name, ep_dom->suffix);
	fi->domain_attr->name[name_len] = '\0';

	*info = fi;
	return 0;
err:
	fi_freeinfo(fi);
	return ret;
}