Пример #1
0
static void free_ep_res(void)
{
	fi_close(&av->fid);
	fi_close(&mr->fid);
	FT_CLOSEV(rx_ep, ctx_cnt);
	FT_CLOSEV(tx_ep, ctx_cnt);
	FT_CLOSEV(rcq, ctx_cnt);
	FT_CLOSEV(scq, ctx_cnt);
	free(buf);
	free(rcq);
	free(scq);
	free(tx_ep);
	free(rx_ep);
}
Пример #2
0
static void free_ep_res(void)
{
	FT_CLOSEV(ep, ep_cnt);
	fi_close(&av->fid);
	fi_close(&mr->fid);
	fi_close(&rcq->fid);
	fi_close(&srx_ctx->fid);
	fi_close(&scq->fid);
	fi_close(&stx_ctx->fid);
	free(buf);
	free(remote_fi_addr);
}
Пример #3
0
static int alloc_ep_res(struct fi_info *fi)
{
	struct fi_cq_attr cq_attr;
	struct fi_rx_attr rx_attr;
	struct fi_tx_attr tx_attr;
	struct fi_av_attr av_attr;
	int i, ret = 0;

	buffer_size = test_size[TEST_CNT - 1].size;
	buf = malloc(buffer_size);

	remote_fi_addr = (fi_addr_t *)malloc(sizeof(*remote_fi_addr) * ep_cnt);

	if (!buf || !remote_fi_addr) {
		perror("malloc");
		goto err1;
	}

	memset(&cq_attr, 0, sizeof cq_attr);
	cq_attr.format = FI_CQ_FORMAT_CONTEXT;
	cq_attr.wait_obj = FI_WAIT_NONE;
	cq_attr.size = rx_depth;
	
	memset(&tx_attr, 0, sizeof tx_attr);
	memset(&rx_attr, 0, sizeof rx_attr);
	
	ret = fi_stx_context(dom, &tx_attr, &stx_ctx, NULL);
	if (ret) {
		FT_PRINTERR("fi_stx_context", ret);
		goto err1;
	}

	ret = fi_cq_open(dom, &cq_attr, &scq, NULL);
	if (ret) {
		FT_PRINTERR("fi_cq_open", ret);
		goto err2;
	}
	
	ret = fi_srx_context(dom, &rx_attr, &srx_ctx, NULL);
	if (ret) {
		FT_PRINTERR("fi_srx_context", ret);
		goto err3;
	}

	ret = fi_cq_open(dom, &cq_attr, &rcq, NULL);
	if (ret) {
		FT_PRINTERR("fi_cq_open", ret);
		goto err4;
	}

	ret = fi_mr_reg(dom, buf, buffer_size, 0, 0, 0, 0, &mr, NULL);
	if (ret) {
		FT_PRINTERR("fi_mr_reg", ret);
		goto err5;
	}

	memset(&av_attr, 0, sizeof av_attr);
	av_attr.type = fi->domain_attr->av_type ?
			fi->domain_attr->av_type : FI_AV_MAP;
	av_attr.count = ep_cnt;

	ret = fi_av_open(dom, &av_attr, &av, NULL);
	if (ret) {
		FT_PRINTERR("fi_av_open", ret);
		goto err6;
	}

	ep = calloc(ep_cnt, sizeof(*ep));
	if (!ep) {
		perror("malloc");
		goto err7;
	}
	for (i = 0; i < ep_cnt; i++) {
		ret = fi_endpoint(dom, fi, &ep[i], NULL);
		if (ret) {
			FT_PRINTERR("fi_endpoint", ret);
			goto err8;
		}
	}

	return 0;

err8:
	FT_CLOSEV(ep, ep_cnt);
err7:
	fi_close(&av->fid);
err6:
	fi_close(&mr->fid);
err5:
	fi_close(&rcq->fid);
err4:
	fi_close(&srx_ctx->fid);
err3:
	fi_close(&scq->fid);
err2:
	fi_close(&stx_ctx->fid);
err1:
	free(buf);
	free(remote_fi_addr);
	return ret;
}
Пример #4
0
static int alloc_ep_res(struct fid_ep *sep)
{
	struct fi_cq_attr cq_attr;
	struct fi_rx_attr rx_attr;
	struct fi_tx_attr tx_attr;
	struct fi_av_attr av_attr;
	int i, ret;

	buffer_size = test_size[TEST_CNT - 1].size;
	buf = malloc(buffer_size);

	scq = calloc(ctx_cnt, sizeof *scq);
	rcq = calloc(ctx_cnt, sizeof *rcq);

	tx_ep = calloc(ctx_cnt, sizeof *tx_ep);
	rx_ep = calloc(ctx_cnt, sizeof *rx_ep);

	remote_rx_addr = calloc(ctx_cnt, sizeof *remote_rx_addr);
	if (!buf || !scq || !rcq || !tx_ep || !rx_ep || !remote_rx_addr) {
		perror("malloc");
		return -1;
	}

	memset(&cq_attr, 0, sizeof cq_attr);
	cq_attr.format = FI_CQ_FORMAT_CONTEXT;
	cq_attr.wait_obj = FI_WAIT_NONE;
	cq_attr.size = rx_depth;
	
	for (i = 0; i < ctx_cnt; i++) {
		/* Create TX contexts: tx_ep */
		ret = fi_tx_context(sep, i, &tx_attr, &tx_ep[i], NULL);
		if (ret) {
			FT_PRINTERR("fi_tx_context", ret);
			goto err1;
		}

		ret = fi_cq_open(dom, &cq_attr, &scq[i], NULL);
		if (ret) {
			FT_PRINTERR("fi_cq_open", ret);
			goto err2;
		}
	}
	
	for (i = 0; i < ctx_cnt; i++) {
		/* Create RX contexts: rx_ep */
		ret = fi_rx_context(sep, i, &rx_attr, &rx_ep[i], NULL);
		if (ret) {
			FT_PRINTERR("fi_tx_context", ret);
			goto err3;
		}

		ret = fi_cq_open(dom, &cq_attr, &rcq[i], NULL);
		if (ret) {
			FT_PRINTERR("fi_cq_open", ret);
			goto err4;
		}
	}

	ret = fi_mr_reg(dom, buf, buffer_size, 0, 0, 0, 0, &mr, NULL);
	if (ret) {
		FT_PRINTERR("fi_mr_reg", ret);
		goto err5;
	}

	/* Get number of bits needed to represent ctx_cnt */
	while (ctx_cnt >> ++rx_ctx_bits)
		;

	memset(&av_attr, 0, sizeof av_attr);
	av_attr.type = fi->domain_attr->av_type ?
			fi->domain_attr->av_type : FI_AV_MAP;
	av_attr.count = 1;
	av_attr.rx_ctx_bits = rx_ctx_bits;

	/* Open Address Vector */
	ret = fi_av_open(dom, &av_attr, &av, NULL);
	if (ret) {
		FT_PRINTERR("fi_av_open", ret);
		goto err6;
	}

	return 0;

err6:
	fi_close(&mr->fid);
err5:
	FT_CLOSEV(rcq, ctx_cnt);
err4:
	FT_CLOSEV(rx_ep, ctx_cnt);
err3:
	FT_CLOSEV(scq, ctx_cnt);
err2:
	FT_CLOSEV(tx_ep, ctx_cnt);
err1:
	free(buf);
	free(rcq);
	free(scq);
	free(tx_ep);
	free(rx_ep);
	free(remote_rx_addr);
	return ret;
}