/*@ MPIDI_CH3U_VC_SendClose - Initiate a close on a virtual connection Input Parameters: + vc - Virtual connection to close - i - rank of virtual connection within a process group (used for debugging) Notes: The current state of this connection must be either 'MPIDI_VC_STATE_ACTIVE' or 'MPIDI_VC_STATE_REMOTE_CLOSE'. @*/ int MPIDI_CH3U_VC_SendClose( MPIDI_VC_t *vc, int rank ) { MPIDI_CH3_Pkt_t upkt; MPIDI_CH3_Pkt_close_t * close_pkt = &upkt.close; MPIR_Request * sreq; int mpi_errno = MPI_SUCCESS; MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPIDI_CH3U_VC_SENDCLOSE); MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPIDI_CH3U_VC_SENDCLOSE); MPID_THREAD_CS_ENTER(POBJ, vc->pobj_mutex); MPIR_Assert( vc->state == MPIDI_VC_STATE_ACTIVE || vc->state == MPIDI_VC_STATE_REMOTE_CLOSE ); MPIDI_Pkt_init(close_pkt, MPIDI_CH3_PKT_CLOSE); close_pkt->ack = (vc->state == MPIDI_VC_STATE_ACTIVE) ? FALSE : TRUE; /* MT: this is not thread safe, the POBJ CS is scoped to the vc and * doesn't protect this global correctly */ MPIDI_Outstanding_close_ops += 1; MPL_DBG_MSG_FMT(MPIDI_CH3_DBG_DISCONNECT,TYPICAL,(MPL_DBG_FDEST, "sending close(%s) on vc (pg=%p) %p to rank %d, ops = %d", close_pkt->ack ? "TRUE" : "FALSE", vc->pg, vc, rank, MPIDI_Outstanding_close_ops)); /* * A close packet acknowledging this close request could be * received during iStartMsg, therefore the state must * be changed before the close packet is sent. */ if (vc->state == MPIDI_VC_STATE_ACTIVE) { MPIDI_CHANGE_VC_STATE(vc, LOCAL_CLOSE); } else { MPIR_Assert( vc->state == MPIDI_VC_STATE_REMOTE_CLOSE ); MPIDI_CHANGE_VC_STATE(vc, CLOSE_ACKED); } mpi_errno = MPIDI_CH3_iStartMsg(vc, close_pkt, sizeof(*close_pkt), &sreq); MPIR_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|send_close_ack"); if (sreq != NULL) { /* There is still another reference being held by the channel. It will not be released until the pkt is actually sent. */ MPIR_Request_free(sreq); } fn_exit: MPID_THREAD_CS_EXIT(POBJ, vc->pobj_mutex); MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPIDI_CH3U_VC_SENDCLOSE); return mpi_errno; fn_fail: goto fn_exit; }
int MPID_nem_ptl_init_id(MPIDI_VC_t *vc) { int mpi_errno = MPI_SUCCESS; MPID_nem_ptl_vc_area *const vc_ptl = VC_PTL(vc); char *bc; int pmi_errno; int val_max_sz; MPIR_CHKLMEM_DECL(1); MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPID_NEM_PTL_INIT_ID); MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPID_NEM_PTL_INIT_ID); pmi_errno = PMI_KVS_Get_value_length_max(&val_max_sz); MPIR_ERR_CHKANDJUMP1(pmi_errno, mpi_errno, MPI_ERR_OTHER, "**fail", "**fail %d", pmi_errno); MPIR_CHKLMEM_MALLOC(bc, char *, val_max_sz, mpi_errno, "bc"); mpi_errno = vc->pg->getConnInfo(vc->pg_rank, bc, val_max_sz, vc->pg); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_nem_ptl_get_id_from_bc(bc, &vc_ptl->id, &vc_ptl->pt, &vc_ptl->ptg, &vc_ptl->ptc, &vc_ptl->ptr, &vc_ptl->ptrg, &vc_ptl->ptrc); if (mpi_errno) MPIR_ERR_POP(mpi_errno); vc_ptl->id_initialized = TRUE; MPIDI_CHANGE_VC_STATE(vc, ACTIVE); fn_exit: MPIR_CHKLMEM_FREEALL(); MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPID_NEM_PTL_INIT_ID); return mpi_errno; fn_fail: goto fn_exit; }
int MPID_nem_mxm_vc_init(MPIDI_VC_t * vc) { int mpi_errno = MPI_SUCCESS; MPIDI_CH3I_VC *vc_ch = &vc->ch; MPID_nem_mxm_vc_area *vc_area = VC_BASE(vc); MPIDI_STATE_DECL(MPID_STATE_MXM_VC_INIT); MPIDI_FUNC_ENTER(MPID_STATE_MXM_VC_INIT); /* local connection is used for any source communication */ MPIU_Assert(MPID_nem_mem_region.rank != vc->lpid); MPIU_DBG_MSG_FMT(CH3_CHANNEL, VERBOSE, (MPIU_DBG_FDEST, "[%i]=== connecting to %i \n", MPID_nem_mem_region.rank, vc->lpid)); { char *business_card; int val_max_sz; #ifdef USE_PMI2_API val_max_sz = PMI2_MAX_VALLEN; #else mpi_errno = PMI_KVS_Get_value_length_max(&val_max_sz); if (mpi_errno) MPIU_ERR_POP(mpi_errno); #endif business_card = (char *) MPIU_Malloc(val_max_sz); mpi_errno = vc->pg->getConnInfo(vc->pg_rank, business_card, val_max_sz, vc->pg); if (mpi_errno) MPIU_ERR_POP(mpi_errno); vc_area->ctx = vc; vc_area->mxm_ep = &_mxm_obj.endpoint[vc->pg_rank]; mpi_errno = _mxm_connect(&_mxm_obj.endpoint[vc->pg_rank], business_card, vc_area); if (mpi_errno) MPIU_ERR_POP(mpi_errno); MPIU_Free(business_card); } MPIDI_CHANGE_VC_STATE(vc, ACTIVE); vc_area->pending_sends = 0; vc->rndvSend_fn = NULL; vc->rndvRecv_fn = NULL; vc->sendNoncontig_fn = MPID_nem_mxm_SendNoncontig; vc->comm_ops = &comm_ops; vc_ch->iStartContigMsg = MPID_nem_mxm_iStartContigMsg; vc_ch->iSendContig = MPID_nem_mxm_iSendContig; fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MXM_VC_INIT); return mpi_errno; fn_fail: goto fn_exit; }
int MPID_nem_mx_vc_init (MPIDI_VC_t *vc) { uint32_t threshold; MPIDI_CH3I_VC *vc_ch = VC_CH(vc); int mpi_errno = MPI_SUCCESS; /* first make sure that our private fields in the vc fit into the area provided */ MPIU_Assert(sizeof(MPID_nem_mx_vc_area) <= MPID_NEM_VC_NETMOD_AREA_LEN); #ifdef ONDEMAND VC_FIELD(vc, local_connected) = 0; VC_FIELD(vc, remote_connected) = 0; #else { char *business_card; int val_max_sz; int ret; #ifdef USE_PMI2_API val_max_sz = PMI2_MAX_VALLEN; #else mpi_errno = PMI_KVS_Get_value_length_max(&val_max_sz); #endif business_card = (char *)MPIU_Malloc(val_max_sz); mpi_errno = vc->pg->getConnInfo(vc->pg_rank, business_card,val_max_sz, vc->pg); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_nem_mx_get_from_bc (business_card, &VC_FIELD(vc, remote_endpoint_id), &VC_FIELD(vc, remote_nic_id)); if (mpi_errno) MPIU_ERR_POP (mpi_errno); MPIU_Free(business_card); ret = mx_connect(MPID_nem_mx_local_endpoint,VC_FIELD(vc, remote_nic_id),VC_FIELD(vc, remote_endpoint_id), MPID_NEM_MX_FILTER,MX_INFINITE,&(VC_FIELD(vc, remote_endpoint_addr))); MPIU_ERR_CHKANDJUMP1 (ret != MX_SUCCESS, mpi_errno, MPI_ERR_OTHER, "**mx_connect", "**mx_connect %s", mx_strerror (ret)); mx_set_endpoint_addr_context(VC_FIELD(vc, remote_endpoint_addr),(void *)vc); MPIDI_CHANGE_VC_STATE(vc, ACTIVE); } #endif mx_get_info(MPID_nem_mx_local_endpoint, MX_COPY_SEND_MAX, NULL, 0, &threshold, sizeof(uint32_t)); vc->eager_max_msg_sz = threshold; vc->rndvSend_fn = NULL; vc->sendNoncontig_fn = MPID_nem_mx_SendNoncontig; vc->comm_ops = &comm_ops; vc_ch->iStartContigMsg = MPID_nem_mx_iStartContigMsg; vc_ch->iSendContig = MPID_nem_mx_iSendContig; fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPID_nem_newmad_vc_init (MPIDI_VC_t *vc) { MPIDI_CH3I_VC *vc_ch = VC_CH(vc); char *business_card; int mpi_errno = MPI_SUCCESS; int val_max_sz; int ret; #ifdef USE_PMI2_API val_max_sz = PMI2_MAX_VALLEN; #else mpi_errno = PMI_KVS_Get_value_length_max(&val_max_sz); #endif business_card = (char *)MPIU_Malloc(val_max_sz); mpi_errno = vc->pg->getConnInfo(vc->pg_rank, business_card,val_max_sz,vc->pg); if (mpi_errno) MPIU_ERR_POP(mpi_errno); /* Very important */ memset(VC_FIELD(vc, url),0,MPID_NEM_NMAD_MAX_SIZE); mpi_errno = MPID_nem_newmad_get_from_bc (business_card, VC_FIELD(vc, url)); if (mpi_errno) MPIU_ERR_POP (mpi_errno); MPIU_Free(business_card); ret = nm_session_connect(mpid_nem_newmad_session, &(VC_FIELD(vc,p_gate)), VC_FIELD(vc, url)); if (ret != NM_ESUCCESS) fprintf(stdout,"nm_session_connect returned ret = %d\n", ret); nm_gate_ref_set(VC_FIELD(vc, p_gate),(void*)vc); MPIDI_CHANGE_VC_STATE(vc, ACTIVE); vc->eager_max_msg_sz = 32768; vc->rndvSend_fn = NULL; vc->sendNoncontig_fn = MPID_nem_newmad_SendNoncontig; vc->comm_ops = &comm_ops; vc_ch->iStartContigMsg = MPID_nem_newmad_iStartContigMsg; vc_ch->iSendContig = MPID_nem_newmad_iSendContig; fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3_Connect_to_root (const char *port_name, MPIDI_VC_t **new_vc) { int mpi_errno = MPI_SUCCESS; MPIDI_VC_t * vc; MPIU_CHKPMEM_DECL(1); MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_CONNECT_TO_ROOT); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3_CONNECT_TO_ROOT); *new_vc = NULL; /* so that the err handling knows to cleanup */ MPIU_CHKPMEM_MALLOC (vc, MPIDI_VC_t *, sizeof(MPIDI_VC_t), mpi_errno, "vc"); /* FIXME - where does this vc get freed? ANSWER (goodell@) - ch3u_port.c FreeNewVC (but the VC_Destroy is in this file) */ /* init ch3 portion of vc */ MPIDI_VC_Init (vc, NULL, 0); /* init channel portion of vc */ MPIR_ERR_CHKINTERNAL(!nemesis_initialized, mpi_errno, "Nemesis not initialized"); vc->ch.recv_active = NULL; MPIDI_CHANGE_VC_STATE(vc, ACTIVE); *new_vc = vc; /* we now have a valid, disconnected, temp VC */ mpi_errno = MPID_nem_connect_to_root (port_name, vc); if (mpi_errno) MPIR_ERR_POP (mpi_errno); MPIU_CHKPMEM_COMMIT(); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3_CONNECT_TO_ROOT); return mpi_errno; fn_fail: /* freeing without giving the lower layer a chance to cleanup can lead to leaks on error */ if (*new_vc) MPIDI_CH3_VC_Destroy(*new_vc); MPIU_CHKPMEM_REAP(); goto fn_exit; }
/*@ MPIDI_CH3U_Handle_connection - handle connection event Input Parameters: + vc - virtual connection . event - connection event NOTE: This routine is used to transition the VC state. The only events currently handled are TERMINATED events. This routine should be called (with TERMINATED) whenever a connection is terminated whether normally (in MPIDI_CH3_Connection_terminate() ), or abnormally. FIXME: Currently state transitions resulting from receiving CLOSE packets are performed in MPIDI_CH3_PktHandler_Close(). Perhaps that should move here. @*/ int MPIDI_CH3U_Handle_connection(MPIDI_VC_t * vc, MPIDI_VC_Event_t event) { int inuse; int mpi_errno = MPI_SUCCESS; MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPIDI_CH3U_HANDLE_CONNECTION); MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPIDI_CH3U_HANDLE_CONNECTION); switch (event) { case MPIDI_VC_EVENT_TERMINATED: { switch (vc->state) { case MPIDI_VC_STATE_CLOSED: /* Normal termination. */ MPIDI_CHANGE_VC_STATE(vc, INACTIVE); /* MT: this is not thread safe */ MPIDI_Outstanding_close_ops -= 1; MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "outstanding close operations = %d", MPIDI_Outstanding_close_ops); if (MPIDI_Outstanding_close_ops == 0) { MPIDI_CH3_Progress_signal_completion(); mpi_errno = MPIDI_CH3_Channel_close(); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } break; case MPIDI_VC_STATE_INACTIVE: /* VC was terminated before it was activated. This can happen if a failed process was detected before the process used the VC. */ MPL_DBG_MSG(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "VC terminated before it was activated. We probably got a failed" " process notification."); MPIDI_CH3U_Complete_posted_with_error(vc); ++MPIDI_Failed_vc_count; MPIDI_CHANGE_VC_STATE(vc, MORIBUND); break; case MPIDI_VC_STATE_ACTIVE: case MPIDI_VC_STATE_REMOTE_CLOSE: /* This is a premature termination. This process has not started the close protocol. There may be outstanding sends or receives on the local side, remote side or both. */ MPL_DBG_MSG(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "Connection closed prematurely."); MPIDI_CH3U_Complete_posted_with_error(vc); ++MPIDI_Failed_vc_count; MPIDU_Ftb_publish_vc(MPIDU_FTB_EV_UNREACHABLE, vc); MPIDI_CHANGE_VC_STATE(vc, MORIBUND); break; case MPIDI_VC_STATE_LOCAL_CLOSE: /* This is a premature termination. This process has started the close protocol, but hasn't received a CLOSE packet from the remote side. This process may not have been able to send the CLOSE ack=F packet to the remote side. There may be outstanding sends or receives on the local or remote sides. */ case MPIDI_VC_STATE_CLOSE_ACKED: /* This is a premature termination. Both sides have started the close protocol. This process has received CLOSE ack=F, but not CLOSE ack=t. This process may not have been able to send CLOSE ack=T. There should not be any outstanding sends or receives on either side. */ MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "Connection closed prematurely during close protocol. " "Outstanding close operations = %d", MPIDI_Outstanding_close_ops); MPIDI_CH3U_Complete_posted_with_error(vc); ++MPIDI_Failed_vc_count; MPIDU_Ftb_publish_vc(MPIDU_FTB_EV_UNREACHABLE, vc); MPIDI_CHANGE_VC_STATE(vc, MORIBUND); /* MT: this is not thread safe */ MPIDI_Outstanding_close_ops -= 1; if (MPIDI_Outstanding_close_ops == 0) { MPIDI_CH3_Progress_signal_completion(); mpi_errno = MPIDI_CH3_Channel_close(); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } break; default: { MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "Unhandled connection state %d when closing connection",vc->state); mpi_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN, "**ch3|unhandled_connection_state", "**ch3|unhandled_connection_state %p %d", vc, vc->state); goto fn_fail; break; } } /* FIXME: Decrement the reference count? Who increments? */ /* FIXME: The reference count is often already 0. But not always */ /* MPIR_Object_set_ref(vc, 0); ??? */ /* * FIXME: The VC used in connect accept has a NULL * process group */ /* XXX DJG FIXME-MT should we be checking this ref_count? */ if (vc->pg != NULL && (MPIR_Object_get_ref(vc) == 0)) { /* FIXME: Who increments the reference count that this is decrementing? */ /* When the reference count for a vc becomes zero, decrement the reference count of the associated process group. */ /* FIXME: This should be done when the reference count of the vc is first decremented */ MPIDI_PG_release_ref(vc->pg, &inuse); if (inuse == 0) { MPIDI_PG_Destroy(vc->pg); } } break; } default: { break; } } fn_exit: MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPIDI_CH3U_HANDLE_CONNECTION); return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3_PktHandler_Close( MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, intptr_t *buflen, MPIR_Request **rreqp ) { MPIDI_CH3_Pkt_close_t * close_pkt = &pkt->close; int mpi_errno = MPI_SUCCESS; if (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE) { MPIDI_CH3_Pkt_t upkt; MPIDI_CH3_Pkt_close_t * resp_pkt = &upkt.close; MPIR_Request * resp_sreq; MPIDI_Pkt_init(resp_pkt, MPIDI_CH3_PKT_CLOSE); resp_pkt->ack = TRUE; MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL,"sending close(TRUE) to %d", vc->pg_rank); mpi_errno = MPIDI_CH3_iStartMsg(vc, resp_pkt, sizeof(*resp_pkt), &resp_sreq); MPIR_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|send_close_ack"); if (resp_sreq != NULL) { /* There is still another reference being held by the channel. It will not be released until the pkt is actually sent. */ MPIR_Request_free(resp_sreq); } } if (close_pkt->ack == FALSE) { if (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE) { MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(FALSE) from %d, moving to CLOSE_ACKED.", vc->pg_rank); MPIDI_CHANGE_VC_STATE(vc, CLOSE_ACKED); } else /* (vc->state == MPIDI_VC_STATE_ACTIVE) */ { if (vc->state != MPIDI_VC_STATE_ACTIVE) { MPL_DBG_MSG_FMT(MPIDI_CH3_DBG_DISCONNECT, TYPICAL, (MPL_DBG_FDEST, "Unexpected state %s in vc %p (rank=%d) (expecting MPIDI_VC_STATE_ACTIVE)\n", MPIDI_VC_GetStateString(vc->state), vc, vc->pg_rank )); MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(FALSE) from %d, moving to REMOTE_CLOSE.", vc->pg_rank); } MPIR_Assert(vc->state == MPIDI_VC_STATE_ACTIVE); MPIDI_CHANGE_VC_STATE(vc, REMOTE_CLOSE); } } else /* (close_pkt->ack == TRUE) */ { MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(TRUE) from %d, moving to CLOSED.", vc->pg_rank); MPIR_Assert (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE || vc->state == MPIDI_VC_STATE_CLOSE_ACKED); MPIDI_CHANGE_VC_STATE(vc, CLOSED); /* For example, with sockets, Connection_terminate will close the socket */ mpi_errno = MPIDI_CH3_Connection_terminate(vc); } *buflen = sizeof(MPIDI_CH3_Pkt_t); *rreqp = NULL; fn_fail: return mpi_errno; }
int MPID_nem_scif_vc_init(MPIDI_VC_t * vc) { int mpi_errno = MPI_SUCCESS; MPIDI_CH3I_VC *vc_ch = &vc->ch; MPID_nem_scif_vc_area *vc_scif = VC_SCIF(vc); int ret; size_t s; scifconn_t *sc; off_t offset; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_SCIF_VC_INIT); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_SCIF_VC_INIT); vc->sendNoncontig_fn = MPID_nem_scif_SendNoncontig; vc_ch->iStartContigMsg = MPID_nem_scif_iStartContigMsg; vc_ch->iSendContig = MPID_nem_scif_iSendContig; vc_ch->next = NULL; vc_ch->prev = NULL; ASSIGN_SC_TO_VC(vc_scif, NULL); vc_scif->send_queue.head = vc_scif->send_queue.tail = NULL; vc_scif->sc = sc = &MPID_nem_scif_conns[vc->pg_rank]; vc_scif->terminate = 0; sc->vc = vc; /* do the connection */ if (vc->pg_rank < MPID_nem_scif_myrank) { sc->fd = scif_open(); MPIU_ERR_CHKANDJUMP1(sc->fd == -1, mpi_errno, MPI_ERR_OTHER, "**scif_open", "**scif_open %s", MPIU_Strerror(errno)); mpi_errno = get_addr(vc, &sc->addr); if (mpi_errno) MPIU_ERR_POP(mpi_errno); ret = scif_connect(sc->fd, &sc->addr); MPIU_ERR_CHKANDJUMP1(ret == -1, mpi_errno, MPI_ERR_OTHER, "**scif_connect", "**scif_connect %s", MPIU_Strerror(errno)); } else { ret = scif_accept(listen_fd, &sc->addr, &sc->fd, SCIF_ACCEPT_SYNC); MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**scif_accept", "**scif_accept %s", MPIU_Strerror(errno)); } MPIDI_CHANGE_VC_STATE(vc, ACTIVE); ret = MPID_nem_scif_init_shmsend(&sc->csend, sc->fd, vc->pg_rank); MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**scif_init_shmsend", "**scif_init_shmsend %s", MPIU_Strerror(errno)); /* Exchange offsets */ s = scif_send(sc->fd, &sc->csend.offset, sizeof(off_t), SCIF_SEND_BLOCK); MPIU_ERR_CHKANDJUMP1(s != sizeof(off_t), mpi_errno, MPI_ERR_OTHER, "**scif_send", "**scif_send %s", MPIU_Strerror(errno)); s = scif_recv(sc->fd, &offset, sizeof(off_t), SCIF_RECV_BLOCK); MPIU_ERR_CHKANDJUMP1(s != sizeof(off_t), mpi_errno, MPI_ERR_OTHER, "**scif_recv", "**scif_recv %s", MPIU_Strerror(errno)); ret = MPID_nem_scif_init_shmrecv(&sc->crecv, sc->fd, offset, vc->pg_rank); MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**scif_init_shmrecv", "**scif_init_shmrecv %s", MPIU_Strerror(errno)); MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_SCIF_VC_INIT); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }