int ofi_mr_insert(struct ofi_util_mr * in_mr_h, const struct fi_mr_attr *in_attr, uint64_t * out_key, void * in_prov_mr) { struct fi_mr_attr * item; if (!in_attr || in_attr->iov_count <= 0 || !in_prov_mr) { return -FI_EINVAL; } item = create_mr_attr_copy(in_attr, in_prov_mr); if (!item) return -FI_ENOMEM; /* Scalable MR handling: use requested key and offset */ if (in_mr_h->mr_type == FI_MR_SCALABLE) { item->offset = (uintptr_t) in_attr->mr_iov[0].iov_base + in_attr->offset; /* verify key doesn't already exist */ if (rbtFind(in_mr_h->map_handle, &item->requested_key)) { free((void *)item->mr_iov); free(item); return -FI_EINVAL; } } else { item->requested_key = get_mr_key(in_mr_h); item->offset = (uintptr_t) in_attr->mr_iov[0].iov_base; } rbtInsert(in_mr_h->map_handle, &item->requested_key, item); *out_key = item->requested_key; return 0; }
static int alloc_ep_res(struct fi_info *fi) { struct fi_cq_attr cq_attr; struct fi_av_attr av_attr; int ret; buffer_size = opts.user_options & FT_OPT_SIZE ? opts.transfer_size : test_size[TEST_CNT - 1].size; buf = malloc(MAX(buffer_size, sizeof(uint64_t))); if (!buf) { perror("malloc"); return -1; } result = malloc(MAX(buffer_size, sizeof(uint64_t))); if (!result) { perror("malloc"); return -1; } compare = malloc(MAX(buffer_size, sizeof(uint64_t))); if (!compare) { 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 = 128; ret = fi_cq_open(dom, &cq_attr, &scq, NULL); if (ret) { FT_PRINTERR("fi_cq_open", ret); goto err1; } ret = fi_cq_open(dom, &cq_attr, &rcq, NULL); if (ret) { FT_PRINTERR("fi_cq_open", ret); goto err2; } // registers local data buffer buff that specifies // the first operand of the atomic operation ret = fi_mr_reg(dom, buf, MAX(buffer_size, sizeof(uint64_t)), FI_REMOTE_READ | FI_REMOTE_WRITE, 0, get_mr_key(), 0, &mr, NULL); if (ret) { FT_PRINTERR("fi_mr_reg", ret); goto err3; } // registers local data buffer that stores initial value of // the remote buffer ret = fi_mr_reg(dom, result, MAX(buffer_size, sizeof(uint64_t)), FI_REMOTE_READ | FI_REMOTE_WRITE, 0, get_mr_key(), 0, &mr_result, NULL); if (ret) { FT_PRINTERR("fi_mr_reg", -ret); goto err4; } // registers local data buffer that contains comparison data ret = fi_mr_reg(dom, compare, MAX(buffer_size, sizeof(uint64_t)), FI_REMOTE_READ | FI_REMOTE_WRITE, 0, get_mr_key(), 0, &mr_compare, 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 = 1; av_attr.name = NULL; ret = fi_av_open(dom, &av_attr, &av, NULL); if (ret) { FT_PRINTERR("fi_av_open", ret); goto err6; } ret = fi_endpoint(dom, fi, &ep, NULL); if (ret) { FT_PRINTERR("fi_endpoint", ret); goto err7; } return 0; err7: fi_close(&av->fid); err6: fi_close(&mr_compare->fid); err5: fi_close(&mr_result->fid); err4: fi_close(&mr->fid); err3: fi_close(&rcq->fid); err2: fi_close(&scq->fid); err1: free(buf); free(result); free(compare); return ret; }