static int util_wait_fd_run(struct fid_wait *wait_fid, int timeout) { struct util_wait_fd *wait; uint64_t start; void *context; int ret; wait = container_of(wait_fid, struct util_wait_fd, util_wait.wait_fid); start = (timeout >= 0) ? fi_gettime_ms() : 0; while (1) { fd_signal_reset(&wait->signal); ret = fi_poll(&wait->util_wait.pollset->poll_fid, &context, 1); if (ret > 0) return 0; else if (ret < 0) return ret; if (timeout >= 0) { timeout -= (int) (fi_gettime_ms() - start); if (timeout <= 0) return -FI_ETIMEDOUT; } context = fi_epoll_wait(wait->epoll_fd, timeout); } }
static int util_wait_fd_try(struct util_wait *wait) { struct ofi_wait_fd_entry *fd_entry; struct util_wait_fd *wait_fd; void *context; int ret; wait_fd = container_of(wait, struct util_wait_fd, util_wait); fd_signal_reset(&wait_fd->signal); fastlock_acquire(&wait_fd->lock); dlist_foreach_container(&wait_fd->fd_list, struct ofi_wait_fd_entry, fd_entry, entry) { ret = fd_entry->wait_try(fd_entry->arg); if (ret != FI_SUCCESS) { fastlock_release(&wait_fd->lock); return ret; } } fastlock_release(&wait_fd->lock); ret = fi_poll(&wait->pollset->poll_fid, &context, 1); return (ret > 0) ? -FI_EAGAIN : (ret == -FI_EAGAIN) ? FI_SUCCESS : ret; }
static int send_recv() { void *context[MAX_POLL_CNT]; struct fi_cq_entry comp; int ret, send_pending = 0, recv_pending = 0; int ret_count = 0; int i; fprintf(stdout, "Posting a recv...\n"); ret = fi_recv(ep, buf, rx_size, fi_mr_desc(mr), remote_fi_addr, &fi_ctx_recv); if (ret) { FT_PRINTERR("fi_recv", ret); return ret; } recv_pending++; fprintf(stdout, "Posting a send...\n"); ret = fi_send(ep, buf, tx_size, fi_mr_desc(mr), remote_fi_addr, &fi_ctx_send); if (ret) { FT_PRINTERR("fi_send", ret); return ret; } send_pending++; while (send_pending || recv_pending) { struct fid_cq *cq; /* Poll send and recv CQs */ do { ret_count = fi_poll(pollset, context, MAX_POLL_CNT); if (ret_count < 0) { FT_PRINTERR("fi_poll", ret_count); return ret_count; } } while (!ret_count); fprintf(stdout, "Retreived %d event(s)\n", ret_count); for (i = 0; i < ret_count; i++) { if (context[i] == &txcq) { printf("Send completion received\n"); cq = txcq; send_pending--; } else if (context[i] == &rxcq) { printf("Recv completion received\n"); cq = rxcq; recv_pending--; } else { printf("Unknown completion received\n"); return -1; } /* Read the completion entry */ ret = fi_cq_sread(cq, &comp, 1, NULL, -1); if (ret < 0) { if (ret == -FI_EAVAIL) { cq_readerr(cq, "cq"); } else { FT_PRINTERR("fi_cq_sread", ret); } return ret; } } } return 0; }