int ompi_mtl_psm_iprobe(struct mca_mtl_base_module_t* mtl, struct ompi_communicator_t *comm, int src, int tag, int *flag, struct ompi_status_public_t *status) { uint64_t mqtag, tagsel; psm_mq_status_t mqstat; psm_error_t err; PSM_MAKE_TAGSEL(src, tag, comm->c_contextid, mqtag, tagsel); err = psm_mq_iprobe(ompi_mtl_psm.mq, mqtag, tagsel, &mqstat); if (err == PSM_OK) { *flag = 1; if(MPI_STATUS_IGNORE != status) { status->MPI_SOURCE = PSM_GET_MQRANK(mqstat.msg_tag); status->MPI_TAG = PSM_GET_MQUTAG(mqstat.msg_tag); status->_ucount = mqstat.nbytes; switch (mqstat.error_code) { case PSM_OK: status->MPI_ERROR = OMPI_SUCCESS; break; case PSM_MQ_TRUNCATION: status->MPI_ERROR = MPI_ERR_TRUNCATE; break; default: status->MPI_ERROR = MPI_ERR_INTERN; } } return OMPI_SUCCESS; } else if (err == PSM_MQ_INCOMPLETE) { *flag = 0; return OMPI_SUCCESS; } else return OMPI_ERROR; }
int ompi_mtl_psm_progress( void ) { psm_error_t err; mca_mtl_psm_request_t* mtl_psm_request; psm_mq_status_t psm_status; psm_mq_req_t req; int completed = 1; do { err = psm_mq_ipeek(ompi_mtl_psm.mq, &req, NULL); if (err == PSM_MQ_INCOMPLETE) { return completed; } else if (err != PSM_OK) { goto error; } completed++; err = psm_mq_test(&req, &psm_status); if (err != PSM_OK) { goto error; } mtl_psm_request = (mca_mtl_psm_request_t*) psm_status.context; if (mtl_psm_request->type == OMPI_MTL_PSM_IRECV) { ompi_mtl_datatype_unpack(mtl_psm_request->convertor, mtl_psm_request->buf, psm_status.msg_length); mtl_psm_request->super.ompi_req->req_status.MPI_SOURCE = PSM_GET_MQRANK(psm_status.msg_tag); mtl_psm_request->super.ompi_req->req_status.MPI_TAG = PSM_GET_MQUTAG(psm_status.msg_tag); mtl_psm_request->super.ompi_req->req_status._ucount = psm_status.nbytes; } if(mtl_psm_request->type == OMPI_MTL_PSM_ISEND) { if (mtl_psm_request->free_after) { free(mtl_psm_request->buf); } } switch (psm_status.error_code) { case PSM_OK: mtl_psm_request->super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS; break; case PSM_MQ_TRUNCATION: mtl_psm_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE; break; default: mtl_psm_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_INTERN; } mtl_psm_request->super.completion_callback(&mtl_psm_request->super); } while (1); error: opal_show_help("help-mtl-psm.txt", "error polling network", true, psm_error_get_string(err)); return 1; }