root/ompi/mca/pml/yalla/pml_yalla_request.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mca_pml_yalla_request_release
  2. mca_pml_yalla_check_request_state
  3. mca_pml_yalla_send_request_free
  4. mca_pml_yalla_send_request_cancel
  5. mca_pml_yalla_recv_request_free
  6. mca_pml_yalla_recv_request_cancel
  7. init_mxm_base_req
  8. init_mxm_send_req
  9. init_mxm_recv_req
  10. init_base_req
  11. mca_pml_yalla_send_completion_cb
  12. mca_pml_yalla_bsend_completion_cb
  13. mca_pml_yalla_recv_completion_cb
  14. mca_pml_yalla_send_request_construct
  15. mca_pml_yalla_send_request_destruct
  16. mca_pml_yalla_bsend_request_construct
  17. mca_pml_yalla_recv_request_construct
  18. mca_pml_yalla_recv_request_destruct
  19. mca_pml_yalla_init_reqs

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (C) Mellanox Technologies Ltd. 2001-2011.  ALL RIGHTS RESERVED.
   4  * Copyright (c) 2015      Los Alamos National Security, LLC. All rights
   5  *                         reserved.
   6  * $COPYRIGHT$
   7  *
   8  * Additional copyrights may follow
   9  *
  10  * $HEADER$
  11  */
  12 
  13 #include "pml_yalla_request.h"
  14 
  15 #include "ompi/mca/pml/base/pml_base_bsend.h"
  16 #include "ompi/message/message.h"
  17 
  18 
  19 static inline void mca_pml_yalla_request_release(mca_pml_yalla_base_request_t *req,
  20                                                  mca_pml_yalla_freelist_t *fl)
  21 {
  22     if (req->convertor != NULL) {
  23         mca_pml_yalla_convertor_free(req->convertor);
  24         req->convertor = NULL;
  25     }
  26     OBJ_RELEASE(req->ompi.req_mpi_object.comm);
  27 
  28 #if PML_YALLA_ENABLE_DEBUG
  29     req->ompi.req_state = OMPI_REQUEST_INVALID;
  30 #endif
  31     PML_YALLA_FREELIST_RETURN(fl, &req->ompi.super);
  32 }
  33 
  34 static inline int
  35 mca_pml_yalla_check_request_state(mca_pml_yalla_base_request_t *req, mxm_req_base_t *mxm_base)
  36 {
  37     if (mxm_base->state != MXM_REQ_COMPLETED) {
  38          PML_YALLA_VERBOSE(8, "request %p free called before completed", (void*)req);
  39          req->flags |= MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED;
  40          return 0;
  41     }
  42 
  43     return 1;
  44 }
  45 
  46 static int mca_pml_yalla_send_request_free(ompi_request_t **request)
  47 {
  48     mca_pml_yalla_send_request_t *sreq = (mca_pml_yalla_send_request_t*)(*request);
  49 
  50     PML_YALLA_VERBOSE(9, "free send request *%p=%p", (void *)request, (void *)*request);
  51 
  52     if (mca_pml_yalla_check_request_state(&sreq->super, PML_YALLA_MXM_REQBASE(sreq))) {
  53         mca_pml_yalla_request_release(&sreq->super, &ompi_pml_yalla.send_reqs);
  54     }
  55 
  56     *request = MPI_REQUEST_NULL;
  57     return OMPI_SUCCESS;
  58 }
  59 
  60 static int mca_pml_yalla_send_request_cancel(ompi_request_t *request, int flag)
  61 {
  62     mca_pml_yalla_send_request_t *sreq = (mca_pml_yalla_send_request_t*)request;
  63     mxm_error_t error;
  64 
  65     if (REQUEST_COMPLETE(request)) {
  66         /*
  67          * This might be a buffered send request which has completed anyway, so
  68          * we cannot cancel it anymore. Just hope for the best.
  69          */
  70         PML_YALLA_VERBOSE(7, "not canceling a completed send request %p", (void *)request);
  71         return OMPI_SUCCESS;
  72     }
  73 
  74     error = mxm_req_cancel_send(&sreq->mxm);
  75     if ((error != MXM_OK) && (error != MXM_ERR_NO_PROGRESS)) {
  76         PML_YALLA_ERROR("failed to cancel send request %p: %s", (void *)request,
  77                         mxm_error_string(error));
  78         return OMPI_ERROR;
  79     }
  80 
  81     PML_YALLA_VERBOSE(9, "canceled send request %p", (void *)request);
  82     return OMPI_SUCCESS;
  83 }
  84 
  85 static int mca_pml_yalla_recv_request_free(ompi_request_t **request)
  86 {
  87     mca_pml_yalla_recv_request_t *rreq = (mca_pml_yalla_recv_request_t*)(*request);
  88 
  89     PML_YALLA_VERBOSE(9, "free receive request *%p=%p", (void *)request, (void *)*request);
  90 
  91     if (mca_pml_yalla_check_request_state(&rreq->super, PML_YALLA_MXM_REQBASE(rreq))) {
  92         mca_pml_yalla_request_release(&rreq->super, &ompi_pml_yalla.recv_reqs);
  93     }
  94 
  95     *request = MPI_REQUEST_NULL;
  96     return OMPI_SUCCESS;
  97 }
  98 
  99 static int mca_pml_yalla_recv_request_cancel(ompi_request_t *request, int flag)
 100 {
 101     mca_pml_yalla_recv_request_t *rreq = (mca_pml_yalla_recv_request_t*)request;
 102     mxm_error_t error;
 103 
 104     error = mxm_req_cancel_recv(&rreq->mxm);
 105     if ((error != MXM_OK) && (error != MXM_ERR_NO_PROGRESS)) {
 106         PML_YALLA_ERROR("failed to cancel receive request %p: %s", (void *)request,
 107                         mxm_error_string(error));
 108         return OMPI_ERROR;
 109     }
 110 
 111     PML_YALLA_VERBOSE(9, "canceled receive request %p", (void *)request);
 112     return OMPI_SUCCESS;
 113 }
 114 
 115 static void init_mxm_base_req(mxm_req_base_t *mxm_req_base)
 116 {
 117     mxm_req_base->state              = MXM_REQ_NEW;
 118     mxm_req_base->mq                 = NULL;
 119     mxm_req_base->conn               = NULL;
 120     mxm_req_base->data_type          = MXM_REQ_DATA_BUFFER;
 121     mxm_req_base->data.buffer.ptr    = NULL;
 122     mxm_req_base->data.buffer.length = 0;
 123     mxm_req_base->data.buffer.memh   = 0;
 124     mxm_req_base->context            = NULL;
 125     mxm_req_base->completed_cb       = NULL;
 126 }
 127 
 128 static void init_mxm_send_req(mxm_send_req_t *mxm_sreq)
 129 {
 130     init_mxm_base_req(&mxm_sreq->base);
 131     mxm_sreq->opcode           = MXM_REQ_OP_SEND;
 132     mxm_sreq->op.send.imm_data = 0;
 133     mxm_sreq->op.send.tag      = 0;
 134 #if defined(MXM_REQ_SEND_FLAG_REENTRANT)
 135     mxm_sreq->flags            = MXM_REQ_SEND_FLAG_REENTRANT;
 136 #else
 137     mxm_sreq->flags            = 0;
 138 #endif
 139 }
 140 
 141 static void init_mxm_recv_req(mxm_recv_req_t *mxm_rreq)
 142 {
 143     init_mxm_base_req(&mxm_rreq->base);
 144     mxm_rreq->tag             = 0;
 145     mxm_rreq->tag_mask        = 0x7fffffff;
 146 }
 147 
 148 static void init_base_req(mca_pml_yalla_base_request_t *req)
 149 {
 150     OMPI_REQUEST_INIT(&req->ompi, false);
 151     req->ompi.req_type             = OMPI_REQUEST_PML;
 152     req->ompi.req_start            = mca_pml_yalla_start;
 153     req->ompi.req_cancel           = NULL;
 154     req->ompi.req_complete_cb      = NULL;
 155     req->ompi.req_complete_cb_data = NULL;
 156     req->convertor                  = NULL;
 157 }
 158 
 159 static void mca_pml_yalla_send_completion_cb(void *context)
 160 {
 161     mca_pml_yalla_send_request_t* sreq = context;
 162 
 163     switch (sreq->mxm.base.error) {
 164     case MXM_OK:
 165         sreq->super.ompi.req_status.MPI_ERROR  = OMPI_SUCCESS;
 166         break;
 167     case MXM_ERR_CANCELED:
 168         sreq->super.ompi.req_status._cancelled = true;
 169         break;
 170     default:
 171         sreq->super.ompi.req_status.MPI_ERROR  = MPI_ERR_INTERN;
 172         break;
 173     }
 174 
 175     PML_YALLA_VERBOSE(8, "send request %p completed with status %s", (void *)sreq,
 176                    mxm_error_string(sreq->mxm.base.error));
 177 
 178     ompi_request_complete(&sreq->super.ompi, true);
 179     if (sreq->super.flags & MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED) {
 180         PML_YALLA_VERBOSE(7, "release request %p because free was already called", (void *)sreq);
 181         mca_pml_yalla_request_release(&sreq->super, &ompi_pml_yalla.send_reqs);
 182     }
 183 }
 184 
 185 static void mca_pml_yalla_bsend_completion_cb(void *context)
 186 {
 187     mca_pml_yalla_bsend_request_t *bsreq = context;
 188 
 189     PML_YALLA_VERBOSE(8, "bsend request %p completed with status %s", (void *)bsreq,
 190                       mxm_error_string(bsreq->mxm.base.error));
 191 
 192     mca_pml_base_bsend_request_free(bsreq->mxm.base.data.buffer.ptr);
 193     PML_YALLA_FREELIST_RETURN(&ompi_pml_yalla.bsend_reqs, &bsreq->super);
 194 }
 195 
 196 static void mca_pml_yalla_recv_completion_cb(void *context)
 197 {
 198     mca_pml_yalla_recv_request_t* rreq = context;
 199 
 200     PML_YALLA_SET_RECV_STATUS(&rreq->mxm, rreq->mxm.completion.actual_len,
 201                               &rreq->super.ompi.req_status);
 202 
 203     PML_YALLA_VERBOSE(8, "receive request %p completed with status %s source %d rtag %d(%d/0x%x) len %zu",
 204                       (void *)rreq, mxm_error_string(rreq->mxm.base.error),
 205                       rreq->mxm.completion.sender_imm, rreq->mxm.completion.sender_tag,
 206                       rreq->mxm.tag, rreq->mxm.tag_mask,
 207                       rreq->mxm.completion.actual_len);
 208 
 209     ompi_request_complete(&rreq->super.ompi, true);
 210     if (rreq->super.flags & MCA_PML_YALLA_REQUEST_FLAG_FREE_CALLED) {
 211         PML_YALLA_VERBOSE(7, "release request %p because free was already called", (void *)rreq);
 212         mca_pml_yalla_request_release(&rreq->super, &ompi_pml_yalla.recv_reqs);
 213     }
 214 }
 215 
 216 static void mca_pml_yalla_send_request_construct(mca_pml_yalla_send_request_t* sreq)
 217 {
 218     init_base_req(&sreq->super);
 219     init_mxm_send_req(&sreq->mxm);
 220     sreq->super.ompi.req_free   = mca_pml_yalla_send_request_free;
 221     sreq->super.ompi.req_cancel = mca_pml_yalla_send_request_cancel;
 222     sreq->mxm.base.context      = sreq;
 223     sreq->mxm.base.completed_cb = mca_pml_yalla_send_completion_cb;
 224 }
 225 
 226 static void mca_pml_yalla_send_request_destruct(mca_pml_yalla_send_request_t *sreq)
 227 {
 228     OMPI_REQUEST_FINI(&sreq->super.ompi);
 229 }
 230 
 231 static void mca_pml_yalla_bsend_request_construct(mca_pml_yalla_bsend_request_t* bsreq)
 232 {
 233     init_mxm_send_req(&bsreq->mxm);
 234     bsreq->mxm.base.context      = bsreq;
 235     bsreq->mxm.base.completed_cb = mca_pml_yalla_bsend_completion_cb;
 236 }
 237 
 238 static void mca_pml_yalla_recv_request_construct(mca_pml_yalla_recv_request_t* rreq)
 239 {
 240     init_base_req(&rreq->super);
 241     init_mxm_recv_req(&rreq->mxm);
 242     rreq->super.ompi.req_free   = mca_pml_yalla_recv_request_free;
 243     rreq->super.ompi.req_cancel = mca_pml_yalla_recv_request_cancel;
 244     rreq->mxm.base.context      = rreq;
 245     rreq->mxm.base.completed_cb = mca_pml_yalla_recv_completion_cb;
 246 }
 247 
 248 static void mca_pml_yalla_recv_request_destruct(mca_pml_yalla_recv_request_t *rreq)
 249 {
 250     OMPI_REQUEST_FINI(&rreq->super.ompi);
 251 }
 252 
 253 void mca_pml_yalla_init_reqs(void)
 254 {
 255     PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.send_reqs, mca_pml_yalla_send_request_t,
 256                             128, -1, 128);
 257 
 258     PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.bsend_reqs, mca_pml_yalla_bsend_request_t,
 259                             128, -1, 128);
 260 
 261     PML_YALLA_FREELIST_INIT(&ompi_pml_yalla.recv_reqs, mca_pml_yalla_recv_request_t,
 262                             128, -1, 128);
 263 }
 264 
 265 OBJ_CLASS_INSTANCE(mca_pml_yalla_send_request_t,
 266                    ompi_request_t,
 267                    mca_pml_yalla_send_request_construct,
 268                    mca_pml_yalla_send_request_destruct);
 269 
 270 OBJ_CLASS_INSTANCE(mca_pml_yalla_bsend_request_t,
 271                    opal_free_list_item_t,
 272                    mca_pml_yalla_bsend_request_construct,
 273                    NULL);
 274 
 275 OBJ_CLASS_INSTANCE(mca_pml_yalla_recv_request_t,
 276                    ompi_request_t,
 277                    mca_pml_yalla_recv_request_construct,
 278                    mca_pml_yalla_recv_request_destruct);
 279 

/* [<][>][^][v][top][bottom][index][help] */