int ft_finalize(void) { struct iovec iov; int ret; struct fi_context ctx; void *desc = fi_mr_desc(mr); strcpy(tx_buf + ft_tx_prefix_size(), "fin"); iov.iov_base = tx_buf; iov.iov_len = 4 + ft_tx_prefix_size(); if (hints->caps & FI_TAGGED) { struct fi_msg_tagged tmsg; memset(&tmsg, 0, sizeof tmsg); tmsg.msg_iov = &iov; tmsg.desc = &desc; tmsg.iov_count = 1; tmsg.addr = remote_fi_addr; tmsg.tag = tx_seq; tmsg.ignore = 0; tmsg.context = &ctx; ret = fi_tsendmsg(ep, &tmsg, FI_INJECT | FI_TRANSMIT_COMPLETE); } else { struct fi_msg msg; memset(&msg, 0, sizeof msg); msg.msg_iov = &iov; msg.desc = &desc; msg.iov_count = 1; msg.addr = remote_fi_addr; msg.context = &ctx; ret = fi_sendmsg(ep, &msg, FI_INJECT | FI_TRANSMIT_COMPLETE); } if (ret) { FT_PRINTERR("transmit", ret); return ret; } ret = ft_get_tx_comp(++tx_seq); if (ret) return ret; ret = ft_get_rx_comp(rx_seq); if (ret) return ret; return 0; }
/* ssize_t fi_tsendmsg(struct fid_ep *ep, const struct fi_msg *msg, uint64_t flags); */ void do_tsendmsg(int len) { int ret; ssize_t sz; int source_done = 0, dest_done = 0; struct fi_cq_tagged_entry s_cqe, d_cqe; struct fi_msg_tagged msg; struct iovec iov; iov.iov_base = source; iov.iov_len = len; msg.msg_iov = &iov; msg.desc = (void **)&loc_mr; msg.iov_count = 1; msg.addr = gni_addr[1]; msg.context = target; msg.data = (uint64_t)target; msg.tag = len; msg.ignore = 0; rdm_tagged_sr_init_data(source, len, 0xef); rdm_tagged_sr_init_data(target, len, 0); sz = fi_tsendmsg(ep[0], &msg, 0); 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 context events!\n"); cr_assert(rdm_tagged_sr_check_data(source, target, len), "Data mismatch"); }