/* ssize_t fi_tsendv(struct fid_ep *ep, const struct iovec *iov, void **desc, size_t count, fi_addr_t dest_addr, uint64_t tag, void *context); */ void do_tsendv(int len) { int i, ret, iov_cnt; ssize_t sz; int source_done = 0, dest_done = 0; struct fi_cq_tagged_entry s_cqe, d_cqe; sz = fi_tsendv(ep[0], src_iov, NULL, 0, gni_addr[1], len * IOV_CNT, iov_dest_buf); cr_assert_eq(sz, -FI_EINVAL); for (iov_cnt = 1; iov_cnt <= IOV_CNT; iov_cnt++) { rdm_tagged_sr_init_data(iov_dest_buf, len * iov_cnt, 0); for (i = 0; i < iov_cnt; i++) { rdm_tagged_sr_init_data(src_iov[i].iov_base, len, 0xab); src_iov[i].iov_len = len; } sz = fi_tsendv(ep[0], src_iov, NULL, iov_cnt, gni_addr[1], len * iov_cnt, iov_dest_buf); cr_assert_eq(sz, 0); sz = fi_trecv(ep[1], iov_dest_buf, len * iov_cnt, NULL, gni_addr[0], len * iov_cnt, 0, src_iov); cr_assert_eq(sz, 0); /* need to progress both CQs simultaneously for rendezvous */ do { ret = fi_cq_read(msg_cq[0], &s_cqe, 1); if (ret == 1) { source_done = 1; } ret = fi_cq_read(msg_cq[1], &d_cqe, 1); if (ret == 1) { dest_done = 1; } } while (!(source_done && dest_done)); dbg_printf("got recv context event!\n"); cr_assert(rdm_tagged_sr_check_iov_data(src_iov, iov_dest_buf, iov_cnt), "Data mismatch"); source_done = dest_done = 0; } }
/* ssize_t fi_tsendv(struct fid_ep *ep, const struct iovec *iov, void **desc, size_t count, fi_addr_t dest_addr, uint64_t tag, void *context); */ void do_tsendv(int len) { int ret; ssize_t sz; int source_done = 0, dest_done = 0; struct fi_cq_tagged_entry s_cqe, d_cqe; struct iovec iov; iov.iov_base = source; iov.iov_len = len; rdm_tagged_sr_init_data(source, len, 0x25); rdm_tagged_sr_init_data(target, len, 0); sz = fi_tsendv(ep[0], &iov, (void **)&loc_mr, 1, gni_addr[1], len, target); cr_assert_eq(sz, 0); sz = fi_trecv(ep[1], target, len, rem_mr, gni_addr[0], len, 0, source); cr_assert_eq(sz, 0); /* need to progress both CQs simultaneously for rendezvous */ do { ret = fi_cq_read(msg_cq[0], &s_cqe, 1); if (ret == 1) { source_done = 1; } ret = fi_cq_read(msg_cq[1], &d_cqe, 1); if (ret == 1) { dest_done = 1; } } while (!(source_done && dest_done)); dbg_printf("got recv context event!\n"); cr_assert(rdm_tagged_sr_check_data(source, target, len), "Data mismatch"); }