static ssize_t psmx2_ep_cancel(fid_t fid, void *context) { struct psmx2_fid_ep *ep; psm2_mq_status2_t status; struct fi_context *fi_context = context; uint64_t flags; struct psmx2_cq_event *event; int err; ep = container_of(fid, struct psmx2_fid_ep, ep.fid); if (!ep->domain) return -FI_EBADF; if (!fi_context) return -FI_EINVAL; switch (PSMX2_CTXT_TYPE(fi_context)) { case PSMX2_TRECV_CONTEXT: flags = FI_RECV | FI_TAGGED; break; case PSMX2_RECV_CONTEXT: case PSMX2_MULTI_RECV_CONTEXT: flags = FI_RECV | FI_MSG; break; default: return -FI_EOPNOTSUPP; } err = psm2_mq_cancel((psm2_mq_req_t *)&PSMX2_CTXT_REQ(fi_context)); if (err == PSM2_OK) { err = psm2_mq_test2((psm2_mq_req_t *)&PSMX2_CTXT_REQ(fi_context), &status); if (err == PSM2_OK && ep->recv_cq) { event = psmx2_cq_create_event( ep->recv_cq, status.context, NULL, /* buf */ flags, 0, /* len */ 0, /* data */ 0, /* tag */ 0 /* olen */, -FI_ECANCELED); if (event) psmx2_cq_enqueue_event(ep->recv_cq, event); else return -FI_ENOMEM; } } return psmx2_errno(err); }
int ompi_mtl_psm2_progress( void ) { psm2_error_t err; mca_mtl_psm2_request_t* mtl_psm2_request; psm2_mq_status2_t psm2_status; psm2_mq_req_t req; int completed = 1; do { err = psm2_mq_ipeek2(ompi_mtl_psm2.mq, &req, NULL); if (err == PSM2_MQ_INCOMPLETE) { return completed; } else if (err != PSM2_OK) { goto error; } completed++; err = psm2_mq_test2(&req, &psm2_status); if (err != PSM2_OK) { goto error; } mtl_psm2_request = (mca_mtl_psm2_request_t*) psm2_status.context; if (mtl_psm2_request->type == OMPI_mtl_psm2_IRECV) { mtl_psm2_request->super.ompi_req->req_status.MPI_SOURCE = psm2_status.msg_tag.tag1; mtl_psm2_request->super.ompi_req->req_status.MPI_TAG = psm2_status.msg_tag.tag0; mtl_psm2_request->super.ompi_req->req_status._ucount = psm2_status.nbytes; ompi_mtl_datatype_unpack(mtl_psm2_request->convertor, mtl_psm2_request->buf, psm2_status.msg_length); } if(mtl_psm2_request->type == OMPI_mtl_psm2_ISEND) { if (mtl_psm2_request->free_after) { free(mtl_psm2_request->buf); } } switch (psm2_status.error_code) { case PSM2_OK: mtl_psm2_request->super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS; break; case PSM2_MQ_TRUNCATION: mtl_psm2_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE; break; default: mtl_psm2_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_INTERN; } mtl_psm2_request->super.completion_callback(&mtl_psm2_request->super); } while (1); error: opal_show_help("help-mtl-psm2.txt", "error polling network", true, psm2_error_get_string(err)); return 1; }