void mvdev_recv_ud_zcopy(MPIR_RHANDLE * rhandle) { mv_qp_pool_entry *rqp; D_PRINT("got zcopy start -- len: %d\n", rhandle->len); /* only way buffer is NULL is if length is zero */ if (NULL == rhandle->buf) { rhandle->buf = &nullrbuffer; } /* we need to make sure we have a QP available -- * otherwise we don't want to take this path */ if(NULL == mvdev.rndv_pool_qps_free_head) { D_PRINT("No QPs available -- using R3\n"); rhandle->protocol = MVDEV_PROTOCOL_R3; mvdev_recv_r3(rhandle); return; } /* try to register the buffer directly */ rhandle->dreg_entry = dreg_register(rhandle->buf, rhandle->len, DREG_ACL_WRITE); if (NULL == rhandle->dreg_entry) { /* failed to register memory, revert to R3 */ D_PRINT("Cannot register mem -- using R3\n"); rhandle->protocol = MVDEV_PROTOCOL_R3; mvdev_recv_r3(rhandle); return; } GET_RNDV_QP(rqp); rhandle->qp_entry = rqp; MV_ASSERT(rhandle->qp_entry != NULL); D_PRINT("before posting recv\n"); mvdev_post_zcopy_recv(rhandle); D_PRINT("Finished posting buffers\n"); MV_Rndv_Send_Reply(rhandle); }
int MPIDI_CH3I_MRAIL_Prepare_rndv (MPIDI_VC_t * vc, MPID_Request * req) { dreg_entry *reg_entry; DEBUG_PRINT ("[prepare cts] rput protocol, recv size %d, segsize %d, io count %d\n", rreq->dev.recv_data_sz, req->dev.segment_size, req->dev.iov_count); req->mrail.protocol = VAPI_PROTOCOL_RPUT; /* Step 1: ready for user space (user buffer or pack) */ if (1 == req->dev.iov_count && (req->dev.OnDataAvail == NULL || (req->dev.OnDataAvail == req->dev.OnFinal) || (req->dev.OnDataAvail == MPIDI_CH3_ReqHandler_UnpackSRBufComplete))) { req->mrail.rndv_buf = req->dev.iov[0].MPID_IOV_BUF; req->mrail.rndv_buf_sz = req->dev.iov[0].MPID_IOV_LEN; req->mrail.rndv_buf_alloc = 0; } else { req->mrail.rndv_buf_sz = req->dev.segment_size; req->mrail.rndv_buf = MPIU_Malloc (req->mrail.rndv_buf_sz); if (req->mrail.rndv_buf == NULL) { /* fall back to r3 if cannot allocate tmp buf */ DEBUG_PRINT ("[rndv sent] set info: cannot allocate space\n"); req->mrail.protocol = VAPI_PROTOCOL_R3; req->mrail.rndv_buf_sz = 0; } else { req->mrail.rndv_buf_alloc = 1; } } req->mrail.rndv_buf_off = 0; /* Step 2: try register and decide the protocol */ if (VAPI_PROTOCOL_RPUT == req->mrail.protocol) { DEBUG_PRINT ("[cts] size registered %d, addr %p\n", req->mrail.rndv_buf_sz, req->mrail.rndv_buf); reg_entry = dreg_register (req->mrail.rndv_buf, req->mrail.rndv_buf_sz); if (NULL == reg_entry) { req->mrail.protocol = VAPI_PROTOCOL_R3; if (1 == req->mrail.rndv_buf_alloc) { MPIU_Free (req->mrail.rndv_buf); req->mrail.rndv_buf_alloc = 0; req->mrail.rndv_buf_sz = 0; req->mrail.rndv_buf = NULL; } req->mrail.rndv_buf_alloc = 0; /*MRAILI_Prepost_R3(); */ } DEBUG_PRINT ("[prepare cts] register success\n"); } if (VAPI_PROTOCOL_RPUT == req->mrail.protocol) { req->mrail.d_entry = reg_entry; return 1; } else return 0; }