static void *do_thread_write_wait(void *data) { int i, tid, ret; ssize_t sz; struct tinfo *info = (struct tinfo *) data; int msg_size = info->msg_size; int iters = info->iters; tid = cntr_test_get_tid(); dbg_printf("%d: writing\n", tid); for (i = 0; i < iters; i++) { sz = fi_write(ep[tid], &source[tid*msg_size], msg_size, loc_mr, gni_addr[0], (uint64_t)&target[tid*msg_size], mr_key, (void *)(READ_CTX+i)); cr_assert_eq(sz, 0); } dbg_printf("%d: waiting\n", tid); ret = fi_cntr_wait(ep_write_cntrs[tid], iters, -1); cr_assert(ret == FI_SUCCESS); dbg_printf("%d: done\n", tid); return NULL; }
static void do_read_wait(int len) { int i, iters = 100; ssize_t sz; uint64_t old_w_cnt, new_w_cnt; uint64_t old_r_cnt; #define READ_CTX 0x4e3dda1aULL init_data(source, len, 0); init_data(target, len, 0xad); old_w_cnt = fi_cntr_read(write_cntr); old_r_cnt = fi_cntr_read(read_cntr); for (i = 0; i < iters; i++) { sz = fi_read(ep[0], source, len, loc_mr, gni_addr[1], (uint64_t)target, mr_key, (void *)READ_CTX); cr_assert_eq(sz, 0); } fi_cntr_wait(read_cntr, old_r_cnt + iters, -1); cr_assert(check_data(source, target, len), "Data mismatch"); new_w_cnt = fi_cntr_read(write_cntr); /* * no fi_read called so old and new read cnts should be equal */ cr_assert(new_w_cnt == old_w_cnt); }
static void do_write_wait(int len) { uint64_t old_w_cnt, new_w_cnt; uint64_t old_r_cnt, new_r_cnt; ssize_t sz; const int iters = 100; int i; init_data(source, len, 0xab); init_data(target, len, 0); old_w_cnt = fi_cntr_read(write_cntr); old_r_cnt = fi_cntr_read(read_cntr); for (i = 0; i < iters; i++) { sz = fi_write(ep[0], source, len, loc_mr, gni_addr[1], (uint64_t)target, mr_key, target); cr_assert_eq(sz, 0); } fi_cntr_wait(write_cntr, old_w_cnt+iters, -1); new_w_cnt = fi_cntr_read(write_cntr); cr_assert(old_w_cnt + iters == new_w_cnt); cr_assert(check_data(source, target, len), "Data mismatch"); new_r_cnt = fi_cntr_read(read_cntr); /* * no fi_read called so old and new read cnts should be equal */ cr_assert(new_r_cnt == old_r_cnt); }
static int run_test(void) { int ret = 0; ret = init_fabric(); if (ret) return ret; if (opts.dst_addr) { /* Execute RMA write operation from Client */ fprintf(stdout, "RMA write to server\n"); sprintf(buf, "%s", welcome_text); ret = write_data(sizeof(char *) * strlen(buf)); if (ret) return ret; ret = fi_cntr_wait(scntr, 1, -1); if (ret < 0) { FT_PRINTERR("fi_cntr_wait", ret); return ret; } fprintf(stdout, "Received a completion event for RMA write\n"); } else { /* Server waits for message from Client */ ret = fi_cntr_wait(rcntr, 1, -1); if (ret < 0) { FT_PRINTERR("fi_cntr_wait", ret); return ret; } fprintf(stdout, "Received data from Client: %s\n", (char *)buf); } /* TODO: need support for finalize operation to sync test */ free_ep_res(); fi_close(&dom->fid); fi_close(&fab->fid); return 0; }
int ft_get_tx_comp(uint64_t total) { int ret; if (txcq) { ret = ft_get_cq_comp(txcq, &tx_cq_cntr, total, -1); } else if (txcntr) { ret = fi_cntr_wait(txcntr, total, -1); if (ret) FT_PRINTERR("fi_cntr_wait", ret); } else { FT_ERR("Trying to get a TX completion when no TX CQ or counter were opened"); ret = -FI_EOTHER; } return ret; }
int ft_get_rx_comp(uint64_t total) { int ret = FI_SUCCESS; if (rxcq) { ret = ft_get_cq_comp(rxcq, &rx_cq_cntr, total, timeout); } else if (rxcntr) { while (fi_cntr_read(rxcntr) < total) { ret = fi_cntr_wait(rxcntr, total, timeout); if (ret) FT_PRINTERR("fi_cntr_wait", ret); else break; } } else { FT_ERR("Trying to get a RX completion when no RX CQ or counter were opened"); ret = -FI_EOTHER; } return ret; }