int ft_finalize(struct fid_ep *tx_ep, struct fid_cq *scq, struct fid_cq *rcq, fi_addr_t addr) { struct fi_msg msg; struct iovec iov; struct fi_context tx_ctx; char buf[4] = "fin"; int ret; iov.iov_base = buf; iov.iov_len = sizeof buf; msg.msg_iov = &iov; msg.desc = NULL; msg.iov_count = 1; msg.addr = addr; msg.context = &tx_ctx; msg.data = 0; ret = fi_sendmsg(tx_ep, &msg, FI_INJECT | FI_TRANSMIT_COMPLETE); if (ret) { FT_PRINTERR("fi_sendmsg", ret); return ret; } wait_for_data_completion(scq, 1); wait_for_data_completion(rcq, 1); return 0; }
static int run(void) { int i, ret = 0; if (!opts.dst_addr) { ret = server_listen(); if (ret) return ret; } ret = opts.dst_addr ? client_connect() : server_connect(); if (ret) return ret; ret = exchange_addr_key(); if (ret) return ret; if (!(opts.user_options & FT_OPT_SIZE)) { for (i = 0; i < TEST_CNT; i++) { if (test_size[i].option > opts.size_option) continue; opts.transfer_size = test_size[i].size; init_test(&opts, test_name, sizeof(test_name)); ret = run_test(); if (ret) goto out; } } else { init_test(&opts, test_name, sizeof(test_name)); ret = run_test(); if (ret) goto out; } sync_test(); wait_for_data_completion(scq, max_credits - credits); /* Finalize before closing ep */ ft_finalize(ep, scq, rcq, FI_ADDR_UNSPEC); out: fi_shutdown(ep, 0); free_ep_res(); if (!opts.dst_addr) free_lres(); fi_close(&dom->fid); fi_close(&fab->fid); return ret; }
static int sync_test(void) { int ret; ret = wait_for_data_completion(scq, max_credits - credits); if (ret) { return ret; } credits = max_credits; ret = opts.dst_addr ? send_xfer(16) : recv_xfer(16); if (ret) { return ret; } return opts.dst_addr ? recv_xfer(16) : send_xfer(16); }
static int run_test(void) { int ret, i; ret = sync_test(); if (ret) return ret; clock_gettime(CLOCK_MONOTONIC, &start); for (i = 0; i < opts.iterations; i++) { switch (op_type) { case FT_RMA_WRITE: ret = write_data(opts.transfer_size); break; case FT_RMA_WRITEDATA: ret = write_data_with_cq_data(opts.transfer_size); if (ret) return ret; ret = wait_remote_writedata_completion(); break; case FT_RMA_READ: ret = read_data(opts.transfer_size); break; } if (ret) return ret; ret = wait_for_data_completion(scq, 1); if (ret) return ret; } clock_gettime(CLOCK_MONOTONIC, &end); if (opts.machr) show_perf_mr(opts.transfer_size, opts.iterations, &start, &end, 1, opts.argc, opts.argv); else show_perf(test_name, opts.transfer_size, opts.iterations, &start, &end, 1); return 0; }