Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}