static int tcpx_prepare_rx_write_resp(struct tcpx_xfer_entry *rx_entry) { struct tcpx_cq *tcpx_rx_cq, *tcpx_tx_cq; struct tcpx_xfer_entry *resp_entry; tcpx_tx_cq = container_of(rx_entry->ep->util_ep.tx_cq, struct tcpx_cq, util_cq); resp_entry = tcpx_xfer_entry_alloc(tcpx_tx_cq, TCPX_OP_MSG_RESP); if (!resp_entry) return -FI_EAGAIN; resp_entry->msg_data.iov[0].iov_base = (void *) &resp_entry->msg_hdr; resp_entry->msg_data.iov[0].iov_len = sizeof(resp_entry->msg_hdr); resp_entry->msg_data.iov_cnt = 1; resp_entry->msg_hdr.hdr.op = ofi_op_msg; resp_entry->msg_hdr.hdr.size = htonll(sizeof(resp_entry->msg_hdr)); resp_entry->flags &= ~FI_COMPLETION; resp_entry->context = NULL; resp_entry->done_len = 0; resp_entry->ep = rx_entry->ep; tcpx_tx_queue_insert(resp_entry->ep, resp_entry); tcpx_cq_report_completion(rx_entry->ep->util_ep.rx_cq, rx_entry, 0); tcpx_rx_cq = container_of(rx_entry->ep->util_ep.rx_cq, struct tcpx_cq, util_cq); tcpx_xfer_entry_release(tcpx_rx_cq, rx_entry); return FI_SUCCESS; }
static int tcpx_prepare_rx_remote_read_resp(struct tcpx_xfer_entry *resp_entry) { int i; resp_entry->msg_data.iov[0].iov_base = (void *) &resp_entry->msg_hdr; resp_entry->msg_data.iov[0].iov_len = sizeof(resp_entry->msg_hdr); resp_entry->msg_data.iov_cnt = 1 + resp_entry->msg_hdr.rma_iov_cnt; resp_entry->msg_hdr.hdr.size = resp_entry->msg_data.iov[0].iov_len; for ( i = 0 ; i < resp_entry->msg_hdr.rma_iov_cnt ; i++ ) { resp_entry->msg_data.iov[i+1].iov_base = (void *) (uintptr_t)resp_entry->msg_hdr.rma_iov[i].addr; resp_entry->msg_data.iov[i+1].iov_len = resp_entry->msg_hdr.rma_iov[i].len; resp_entry->msg_hdr.hdr.size += resp_entry->msg_data.iov[i+1].iov_len; } resp_entry->msg_hdr.hdr.op = ofi_op_read_rsp; resp_entry->msg_hdr.hdr.size = htonll(resp_entry->msg_hdr.hdr.size); resp_entry->flags &= ~FI_COMPLETION; resp_entry->context = NULL; resp_entry->done_len = 0; tcpx_tx_queue_insert(resp_entry->ep, resp_entry); resp_entry->ep->cur_rx_entry = NULL; return FI_SUCCESS; }
static int tcpx_prepare_rx_write_resp(struct tcpx_xfer_entry *rx_entry) { struct tcpx_cq *tcpx_rx_cq, *tcpx_tx_cq; struct tcpx_xfer_entry *resp_entry; tcpx_tx_cq = container_of(rx_entry->ep->util_ep.tx_cq, struct tcpx_cq, util_cq); resp_entry = tcpx_xfer_entry_alloc(tcpx_tx_cq, TCPX_OP_MSG_RESP); if (!resp_entry) return -FI_EAGAIN; resp_entry->iov[0].iov_base = (void *) &resp_entry->hdr; resp_entry->iov[0].iov_len = sizeof(resp_entry->hdr.base_hdr); resp_entry->iov_cnt = 1; resp_entry->hdr.base_hdr.op = ofi_op_msg; resp_entry->hdr.base_hdr.size = sizeof(resp_entry->hdr.base_hdr); resp_entry->hdr.base_hdr.payload_off = (uint8_t)sizeof(resp_entry->hdr.base_hdr); resp_entry->flags &= ~FI_COMPLETION; resp_entry->context = NULL; resp_entry->rem_len = resp_entry->hdr.base_hdr.size; resp_entry->ep = rx_entry->ep; resp_entry->ep->hdr_bswap(&resp_entry->hdr.base_hdr); tcpx_tx_queue_insert(resp_entry->ep, resp_entry); tcpx_cq_report_success(rx_entry->ep->util_ep.rx_cq, rx_entry); tcpx_rx_cq = container_of(rx_entry->ep->util_ep.rx_cq, struct tcpx_cq, util_cq); tcpx_xfer_entry_release(tcpx_rx_cq, rx_entry); return FI_SUCCESS; }