void sep_senddata(int index, int len) { ssize_t sz; struct fi_cq_tagged_entry s_cqe = { (void *) -1, UINT_MAX, UINT_MAX, (void *) -1, UINT_MAX, UINT_MAX }; struct fi_cq_tagged_entry d_cqe = { (void *) -1, UINT_MAX, UINT_MAX, (void *) -1, UINT_MAX, UINT_MAX }; uint64_t s[NUMEPS] = {0}, r[NUMEPS] = {0}, s_e[NUMEPS] = {0}; uint64_t r_e[NUMEPS] = {0}; sep_init_data(source, len, 0xab + index); sep_init_data(target, len, 0); sz = fi_senddata(tx_ep[0][index], source, len, loc_mr[0], (uint64_t)source, rx_addr[index], target); cr_assert_eq(sz, 0); sz = fi_recv(rx_ep[1][index], target, len, rem_mr[0], FI_ADDR_UNSPEC, source); cr_assert_eq(sz, 0); wait_for_cqs(tx_cq[0][index], rx_cq[1][index], &s_cqe, &d_cqe); sep_check_cqe(&s_cqe, target, (FI_MSG|FI_SEND), 0, 0, 0, false); sep_check_cqe(&d_cqe, source, (FI_MSG|FI_RECV|FI_REMOTE_CQ_DATA), target, len, (uint64_t)source, false); s[0] = 1; r[1] = 1; sep_check_cntrs(s, r, s_e, r_e); cr_assert(sep_check_data(source, target, len), "Data mismatch"); }
static int run_test() { int ret; size_t size = 1000; uint64_t remote_cq_data; struct fi_cq_data_entry comp; if (fi->domain_attr->cq_data_size >= sizeof(uint64_t)) { remote_cq_data = 0x0123456789abcdefULL; } else { remote_cq_data = 0x0123456789abcdef & ((0x1ULL << (fi->domain_attr->cq_data_size * 8)) - 1); } if (opts.dst_addr) { fprintf(stdout, "Posting send with immediate data: 0x%" PRIx64 "\n", remote_cq_data); ret = fi_senddata(ep, buf, size, fi_mr_desc(mr), remote_cq_data, 0, buf); if (ret) { FT_PRINTERR("fi_send", ret); return ret; } ft_wait_for_comp(txcq, 1); fprintf(stdout, "Done\n"); } else { fprintf(stdout, "Waiting for immediate data from client\n"); ret = fi_cq_sread(rxcq, &comp, 1, NULL, -1); if (ret < 0) { if (ret == -FI_EAVAIL) { cq_readerr(rxcq, "rxcq"); } else { FT_PRINTERR("fi_cq_sread", ret); } return ret; } /* Verify completion data */ if (comp.flags & FI_REMOTE_CQ_DATA) { if (comp.data == remote_cq_data) fprintf(stdout, "remote_cq_data: success\n"); else fprintf(stdout, "remote_cq_data: failure\n"); fprintf(stdout, "Expected data:0x%" PRIx64 ", Received data:0x%" PRIx64 "\n", remote_cq_data, comp.data); } } return 0; }
static int run_test() { int ret; size_t size = 1000; uint64_t remote_cq_data; struct fi_cq_data_entry comp; /* Set remote_cq_data based on the cq_data_size we got from fi_getinfo */ remote_cq_data = 0x0123456789abcdef & ((0x1ULL << (cq_data_size * 8)) - 1); if (dst_addr) { fprintf(stdout, "Posting send with immediate data: %lx\n", remote_cq_data); ret = fi_senddata(ep, buf, size, fi_mr_desc(mr), remote_cq_data, 0, buf); if (ret) { FI_PRINTERR("fi_send", ret); return ret; } wait_for_completion(scq, 1); fprintf(stdout, "Done\n"); } else { ret = fi_recv(ep, buf, size, fi_mr_desc(mr), 0, buf); if (ret) { FI_PRINTERR("fi_recv", ret); return ret; } fprintf(stdout, "Waiting for immediate data from client\n"); ret = fi_cq_sread(rcq, &comp, 1, NULL, -1); if (ret < 0) { if (ret == -FI_EAVAIL) { cq_readerr(rcq, "rcq"); } else { FI_PRINTERR("fi_cq_read: rcq", ret); } return ret; } /* Verify completion data */ if (comp.flags & FI_REMOTE_CQ_DATA) { if (comp.data == remote_cq_data) fprintf(stdout, "remote_cq_data: success\n"); else fprintf(stdout, "remote_cq_data: failure\n"); fprintf(stdout, "Expected data:0x%lx, Received data:0x%lx\n", remote_cq_data, comp.data); } } return 0; }
static int run_test() { int ret; size_t size = 1000; struct fi_cq_data_entry comp; if (opts.dst_addr) { fprintf(stdout, "Posting send with CQ data: 0x%" PRIx64 "\n", remote_cq_data); ret = fi_senddata(ep, buf, size, fi_mr_desc(mr), remote_cq_data, 0, buf); if (ret) { FT_PRINTERR("fi_send", ret); return ret; } ret = ft_get_tx_comp(++tx_seq); fprintf(stdout, "Done\n"); } else { fprintf(stdout, "Waiting for CQ data from client\n"); ret = fi_cq_sread(rxcq, &comp, 1, NULL, -1); if (ret < 0) { if (ret == -FI_EAVAIL) { ret = ft_cq_readerr(rxcq); } else { FT_PRINTERR("fi_cq_sread", ret); } return ret; } if (comp.flags & FI_REMOTE_CQ_DATA) { if (comp.data == remote_cq_data) { fprintf(stdout, "remote_cq_data: success\n"); ret = 0; } else { fprintf(stdout, "error, Expected data:0x%" PRIx64 ", Received data:0x%" PRIx64 "\n", remote_cq_data, comp.data); ret = -FI_EIO; } } else { fprintf(stdout, "error, CQ data flag not set\n"); ret = -FI_EBADFLAGS; } } return ret; }
/* ssize_t fi_senddata(struct fid_ep *ep, void *buf, size_t len, void *desc, uint64_t data, fi_addr_t dest_addr, void *context); */ void do_senddata(int len) { int ret; ssize_t sz; int source_done = 0, dest_done = 0; struct fi_cq_tagged_entry s_cqe, d_cqe; uint64_t s[NUMEPS] = {0}, r[NUMEPS] = {0}, s_e[NUMEPS] = {0}; uint64_t r_e[NUMEPS] = {0}; rdm_sr_init_data(source, len, 0xab); rdm_sr_init_data(target, len, 0); sz = fi_senddata(ep[0], source, len, loc_mr[0], (uint64_t)source, gni_addr[1], target); cr_assert_eq(sz, 0); sz = fi_recv(ep[1], target, len, rem_mr[0], gni_addr[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)); rdm_sr_check_cqe(&s_cqe, target, (FI_MSG|FI_SEND), 0, 0, 0); rdm_sr_check_cqe(&d_cqe, source, (FI_MSG|FI_RECV|FI_REMOTE_CQ_DATA), target, len, (uint64_t)source); s[0] = 1; r[1] = 1; rdm_sr_check_cntrs(s, r, s_e, r_e); dbg_printf("got context events!\n"); cr_assert(rdm_sr_check_data(source, target, len), "Data mismatch"); }
/* ssize_t fi_senddata(struct fid_ep *ep, void *buf, size_t len, void *desc, uint64_t data, fi_addr_t dest_addr, void *context); */ void do_senddata(int len) { int ret; ssize_t sz; struct fi_cq_entry cqe; rdm_sr_init_data(source, len, 0xab); rdm_sr_init_data(target, len, 0); sz = fi_senddata(ep[0], source, len, loc_mr, (uint64_t)source, gni_addr[1], target); cr_assert_eq(sz, 0); sz = fi_recv(ep[1], target, len, rem_mr, gni_addr[0], source); cr_assert_eq(sz, 0); while ((ret = fi_cq_read(msg_cq[0], &cqe, 1)) == -FI_EAGAIN) { pthread_yield(); } cr_assert_eq(ret, 1); cr_assert_eq((uint64_t)cqe.op_context, (uint64_t)target); dbg_printf("got send context event!\n"); /* TODO get REMOTE_CQ_DATA */ while ((ret = fi_cq_read(msg_cq[1], &cqe, 1)) == -FI_EAGAIN) { pthread_yield(); } cr_assert_eq(ret, 1); cr_assert_eq((uint64_t)cqe.op_context, (uint64_t)source); dbg_printf("got recv context event!\n"); cr_assert(rdm_sr_check_data(source, target, len), "Data mismatch"); }