int ompi_mtl_psm_cancel(struct mca_mtl_base_module_t* mtl, struct mca_mtl_request_t *mtl_request, int flag) { psm_error_t err; psm_mq_status_t status; mca_mtl_psm_request_t *mtl_psm_request = (mca_mtl_psm_request_t*) mtl_request; /* PSM does not support canceling sends */ if(OMPI_MTL_PSM_ISEND == mtl_psm_request->type) { return OMPI_SUCCESS; } err = psm_mq_cancel(&mtl_psm_request->psm_request); if(PSM_OK == err) { err = psm_mq_test(&mtl_psm_request->psm_request, &status); if(PSM_OK == err) { mtl_request->ompi_req->req_status._cancelled = true; mtl_psm_request->super.completion_callback(&mtl_psm_request->super); return OMPI_SUCCESS; } else { return OMPI_ERROR; } } else if(PSM_MQ_INCOMPLETE == err) { return OMPI_SUCCESS; } return OMPI_ERROR; }
static ssize_t psmx_ep_cancel(fid_t fid, void *context) { struct psmx_fid_ep *ep; psm_mq_status_t status; struct fi_context *fi_context = context; uint64_t flags; struct psmx_cq_event *event; int err; ep = container_of(fid, struct psmx_fid_ep, ep.fid); if (!ep->domain) return -FI_EBADF; if (!fi_context) return -FI_EINVAL; switch (PSMX_CTXT_TYPE(fi_context)) { case PSMX_TRECV_CONTEXT: flags = FI_RECV | FI_TAGGED; break; case PSMX_RECV_CONTEXT: case PSMX_MULTI_RECV_CONTEXT: flags = FI_RECV | FI_MSG; break; default: return -FI_EOPNOTSUPP; } err = psm_mq_cancel((psm_mq_req_t *)&PSMX_CTXT_REQ(fi_context)); if (err == PSM_OK) { err = psm_mq_test((psm_mq_req_t *)&PSMX_CTXT_REQ(fi_context), &status); if (err == PSM_OK && ep->recv_cq) { event = psmx_cq_create_event( ep->recv_cq, status.context, NULL, /* buf */ flags, 0, /* len */ 0, /* data */ 0, /* tag */ 0 /* olen */, -FI_ECANCELED); if (event) psmx_cq_enqueue_event(ep->recv_cq, event); else return -FI_ENOMEM; } } return psmx_errno(err); }
static ssize_t psmx_ep_cancel(fid_t fid, void *context) { struct psmx_fid_ep *fid_ep; psm_mq_status_t status; struct fi_context *fi_context = context; int err; fid_ep = container_of(fid, struct psmx_fid_ep, ep.fid); if (!fid_ep->domain) return -EBADF; if (!fi_context) return -EINVAL; err = psm_mq_cancel((psm_mq_req_t *)&PSMX_CTXT_REQ(fi_context)); if (err == PSM_OK) err = psm_mq_test((psm_mq_req_t *)&PSMX_CTXT_REQ(fi_context), &status); return psmx_errno(err); }