/* ssize_t fi_injectdata(struct fid_ep *ep, const void *buf, size_t len, uint64_t data, fi_addr_t dest_addr) */ void do_injectdata(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_injectdata(ep[0], source, len, (uint64_t)source, gni_addr[1]); cr_assert_eq(sz, 0); sz = fi_recv(ep[1], target, len, rem_mr, gni_addr[0], source); cr_assert_eq(sz, 0); /* 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"); }
/* ssize_t fi_injectdata(struct fid_ep *ep, const void *buf, size_t len, uint64_t data, fi_addr_t dest_addr); */ void do_injectdata(int len) { int ret; ssize_t sz; struct fi_cq_tagged_entry 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_injectdata(ep[0], source, len, (uint64_t)source, gni_addr[1]); cr_assert_eq(sz, 0); sz = fi_recv(ep[1], target, len, rem_mr[0], gni_addr[0], source); cr_assert_eq(sz, 0); while ((ret = fi_cq_read(msg_cq[1], &cqe, 1)) == -FI_EAGAIN) { pthread_yield(); /* Manually progress connection to domain 1 */ fi_cq_read(msg_cq[0], &cqe, 1); } rdm_sr_check_cqe(&cqe, source, (FI_MSG|FI_RECV|FI_REMOTE_CQ_DATA), target, len, (uint64_t)source); dbg_printf("got recv context event!\n"); /* don't progress until send counter is updated */ while (fi_cntr_read(send_cntr[0]) < 1) { pthread_yield(); } s[0] = 1; r[1] = 1; rdm_sr_check_cntrs(s, r, s_e, r_e); /* make sure inject does not generate a send competion */ cr_assert_eq(fi_cq_read(msg_cq[0], &cqe, 1), -FI_EAGAIN); cr_assert(rdm_sr_check_data(source, target, len), "Data mismatch"); }
void sep_injectdata(int index, int len) { int ret; ssize_t sz; struct fi_cq_tagged_entry 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, 0x9b + index); sep_init_data(target, len, 0); sz = fi_injectdata(tx_ep[0][index], source, len, (uint64_t)source, rx_addr[index]); 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); while ((ret = fi_cq_read(rx_cq[1][index], &cqe, 1)) == -FI_EAGAIN) { pthread_yield(); /* Manually progress connection to domain 1 */ fi_cq_read(tx_cq[0][index], &cqe, 1); } sep_check_cqe(&cqe, source, (FI_MSG|FI_RECV|FI_REMOTE_CQ_DATA), target, len, (uint64_t)source, false); /* don't progress until send counter is updated */ while (fi_cntr_read(send_cntr[0]) < 1) { pthread_yield(); } s[0] = 1; r[1] = 1; sep_check_cntrs(s, r, s_e, r_e); /* make sure inject does not generate a send competion */ cr_assert_eq(fi_cq_read(tx_cq[0][index], &cqe, 1), -FI_EAGAIN); cr_assert(sep_check_data(source, target, len), "Data mismatch"); }