static int rxm_cq_write_error_trunc(struct rxm_rx_buf *rx_buf, size_t done_len) { int ret; if (rx_buf->ep->util_ep.flags & OFI_CNTR_ENABLED) rxm_cntr_incerr(rx_buf->ep->util_ep.rx_cntr); FI_WARN(&rxm_prov, FI_LOG_CQ, "Message truncated: " "recv buf length: %zu message length: %" PRIu64 "\n", done_len, rx_buf->pkt.hdr.size); ret = ofi_cq_write_error_trunc(rx_buf->ep->util_ep.rx_cq, rx_buf->recv_entry->context, rx_buf->recv_entry->comp_flags | rxm_cq_get_rx_comp_flags(rx_buf), rx_buf->pkt.hdr.size, rx_buf->recv_entry->rxm_iov.iov[0].iov_base, rx_buf->pkt.hdr.data, rx_buf->pkt.hdr.tag, rx_buf->pkt.hdr.size - done_len); if (OFI_UNLIKELY(ret)) { FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to write recv error CQ\n"); return ret; } return 0; }
int mrail_cq_process_buf_recv(struct fi_cq_tagged_entry *comp, struct mrail_recv *recv) { struct fi_recv_context *recv_ctx = comp->op_context; struct fi_msg msg = { .context = recv_ctx, }; struct mrail_ep *mrail_ep; struct mrail_pkt *mrail_pkt; size_t size, len; int ret, retv = 0; if (comp->flags & FI_MORE) { msg.msg_iov = recv->iov; msg.iov_count = recv->count; msg.addr = recv->addr; recv_ctx->context = recv; ret = fi_recvmsg(recv_ctx->ep, &msg, FI_CLAIM); if (ret) { FI_WARN(&mrail_prov, FI_LOG_CQ, "Unable to claim buffered recv\n"); assert(0); // TODO write cq error entry } return ret; } mrail_ep = recv_ctx->ep->fid.context; mrail_pkt = (struct mrail_pkt *)comp->buf; len = comp->len - sizeof(*mrail_pkt); size = ofi_copy_to_iov(&recv->iov[1], recv->count - 1, 0, mrail_pkt->data, len); if (size < len) { FI_WARN(&mrail_prov, FI_LOG_CQ, "Message truncated recv buf " "size: %zu message length: %zu\n", size, len); ret = ofi_cq_write_error_trunc( mrail_ep->util_ep.rx_cq, recv->context, recv->comp_flags | (comp->flags & FI_REMOTE_CQ_DATA), 0, NULL, comp->data, mrail_pkt->hdr.tag, comp->len - size); if (ret) { FI_WARN(&mrail_prov, FI_LOG_CQ, "Unable to write truncation error to util cq\n"); retv = ret; } goto out; } ret = mrail_cq_write_recv_comp(mrail_ep, &mrail_pkt->hdr, comp, recv); if (ret) retv = ret; out: ret = fi_recvmsg(recv_ctx->ep, &msg, FI_DISCARD); if (ret) { FI_WARN(&mrail_prov, FI_LOG_CQ, "Unable to discard buffered recv\n"); retv = ret; } mrail_push_recv(recv); return retv; }