Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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);
}