void ucp_tag_eager_sync_send_ack(ucp_worker_h worker, void *hdr, uint16_t flags) { ucp_eager_sync_hdr_t *eagers_hdr; ucp_request_hdr_t *reqhdr; ucp_request_t *req; ucs_assert(flags & UCP_RECV_DESC_FLAG_EAGER_SYNC); if (flags & UCP_RECV_DESC_FLAG_EAGER_OFFLOAD) { eagers_hdr = hdr; ucp_tag_offload_eager_sync_send_ack(worker, eagers_hdr->req.sender_uuid, eagers_hdr->super.super.tag); return; } if (flags & UCP_RECV_DESC_FLAG_EAGER_ONLY) { reqhdr = &((ucp_eager_sync_hdr_t*)hdr)->req; } else /* first */ { reqhdr = &((ucp_eager_sync_first_hdr_t*)hdr)->req; } ucs_assert(reqhdr->reqptr != 0); ucs_trace_req("send_sync_ack sender_uuid %"PRIx64" remote_request 0x%lx", reqhdr->sender_uuid, reqhdr->reqptr); req = ucp_worker_allocate_reply(worker, reqhdr->sender_uuid); req->send.uct.func = ucp_proto_progress_am_bcopy_single; req->send.proto.am_id = UCP_AM_ID_EAGER_SYNC_ACK; req->send.proto.remote_request = reqhdr->reqptr; req->send.proto.status = UCS_OK; req->send.proto.comp_cb = ucp_request_put; ucp_request_send(req); }
static UCS_F_ALWAYS_INLINE ucs_status_ptr_t ucp_tag_send_req(ucp_request_t *req, size_t count, const ucp_ep_msg_config_t* msg_config, size_t rndv_rma_thresh, size_t rndv_am_thresh, ucp_send_callback_t cb, const ucp_proto_t *proto) { size_t seg_size = (msg_config->max_bcopy - proto->only_hdr_size); size_t rndv_thresh = ucp_tag_get_rndv_threshold(req, count, msg_config->max_iov, rndv_rma_thresh, rndv_am_thresh, seg_size); size_t zcopy_thresh = ucp_proto_get_zcopy_threshold(req, msg_config, count, rndv_thresh); ssize_t max_short = ucp_proto_get_short_max(req, msg_config); ucs_status_t status; ucs_trace_req("select tag request(%p) progress algorithm datatype=%lx " "buffer=%p length=%zu max_short=%zd rndv_thresh=%zu " "zcopy_thresh=%zu", req, req->send.datatype, req->send.buffer, req->send.length, max_short, rndv_thresh, zcopy_thresh); status = ucp_request_send_start(req, max_short, zcopy_thresh, seg_size, rndv_thresh, proto); if (ucs_unlikely(status != UCS_OK)) { if (status == UCS_ERR_NO_PROGRESS) { ucs_assert(req->send.length >= rndv_thresh); /* RMA/AM rendezvous */ status = ucp_tag_send_start_rndv(req); } if (status != UCS_OK) { return UCS_STATUS_PTR(status); } } ucp_request_send_tag_stat(req); /* * Start the request. * If it is completed immediately, release the request and return the status. * Otherwise, return the request. */ status = ucp_request_send(req); if (req->flags & UCP_REQUEST_FLAG_COMPLETED) { ucs_trace_req("releasing send request %p, returning status %s", req, ucs_status_string(status)); ucp_request_put(req); return UCS_STATUS_PTR(status); } ucp_request_set_callback(req, send.cb, cb) ucs_trace_req("returning send request %p", req); return req + 1; }