This source file includes following definitions.
- mca_fbtl_ime_ipreadv
- mca_fbtl_ime_ipwritev
- mca_fbtl_ime_nonblocking_op
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 #include "ompi_config.h"
  11 #include "fbtl_ime.h"
  12 
  13 #include "mpi.h"
  14 #include "ompi/constants.h"
  15 #include "ompi/mca/fbtl/fbtl.h"
  16 
  17 static ssize_t  mca_fbtl_ime_nonblocking_op (ompio_file_t *fh,
  18                  ompi_request_t *request, int io_op);
  19 
  20 ssize_t mca_fbtl_ime_ipreadv (ompio_file_t *fh, ompi_request_t *request)
  21 {
  22     return mca_fbtl_ime_nonblocking_op(fh, request, FBTL_IME_READ);
  23 }
  24 ssize_t  mca_fbtl_ime_ipwritev (ompio_file_t *fh, ompi_request_t *request)
  25 {
  26     return mca_fbtl_ime_nonblocking_op(fh, request, FBTL_IME_WRITE);
  27 }
  28 
  29 static ssize_t mca_fbtl_ime_nonblocking_op (ompio_file_t *fh,
  30                                             ompi_request_t *request, int io_op)
  31 {
  32     mca_fbtl_ime_request_data_t *data;
  33     mca_ompio_request_t *req = (mca_ompio_request_t *) request;
  34     int i=0, req_index = 0, ret;
  35 
  36     data = (mca_fbtl_ime_request_data_t *) malloc ( sizeof (mca_fbtl_ime_request_data_t));
  37     if ( NULL == data ) {
  38         opal_output (1,"could not allocate memory\n");
  39         return OMPI_ERR_OUT_OF_RESOURCE;
  40     }
  41 
  42     
  43 
  44 
  45 
  46 
  47 
  48 
  49     data->allocated_data = (void*) malloc( fh->f_num_of_io_entries *
  50         (sizeof(struct iovec) +
  51          sizeof(struct ime_aiocb) +
  52          sizeof(ssize_t)) );
  53     if (NULL == data->allocated_data) {
  54         opal_output(1, "OUT OF MEMORY\n");
  55         free(data);
  56         return OMPI_ERR_OUT_OF_RESOURCE;
  57     }
  58     data->aio_iovecs = (struct iovec *) data->allocated_data;
  59     data->aio_reqs = (struct ime_aiocb *) (data->aio_iovecs +
  60         fh->f_num_of_io_entries);
  61     data->aio_req_status = (ssize_t *) (data->aio_reqs +
  62         fh->f_num_of_io_entries);
  63 
  64     
  65     data->aio_req_type  = io_op;    
  66     data->aio_req_chunks = mca_fbtl_ime_aio_reqs_max;
  67     data->aio_req_fail_count = 0;
  68     data->aio_total_len = 0;
  69     data->aio_fh = fh;
  70     data->aio_reqs[0].iovcnt = 0;
  71 
  72     
  73     for ( i=0; i<fh->f_num_of_io_entries; i++ ) {
  74         data->aio_iovecs[i].iov_base = fh->f_io_array[i].memory_address;
  75         data->aio_iovecs[i].iov_len = fh->f_io_array[i].length;
  76 
  77         
  78 
  79         if (data->aio_reqs[req_index].iovcnt == 0) {
  80             data->aio_reqs[req_index].iov = &data->aio_iovecs[i];
  81             data->aio_reqs[req_index].iovcnt = 1;
  82             data->aio_reqs[req_index].file_offset  = (off_t)
  83                 fh->f_io_array[i].offset;
  84             data->aio_reqs[req_index].fd  = fh->fd;
  85             data->aio_reqs[req_index].complete_cb = &mca_fbtl_ime_complete_cb;
  86             data->aio_reqs[req_index].user_context = (intptr_t)
  87                 &data->aio_req_status[req_index];
  88             data->aio_req_status[req_index] = FBTL_IME_IN_PROGRESS;
  89         }
  90 
  91         
  92 
  93 
  94 
  95 
  96         if (i+1 != fh->f_num_of_io_entries &&
  97             ((OMPI_MPI_OFFSET_TYPE)(intptr_t)fh->f_io_array[i].offset +
  98              (ptrdiff_t)fh->f_io_array[i].length) ==
  99               (OMPI_MPI_OFFSET_TYPE)(intptr_t)fh->f_io_array[i+1].offset &&
 100             data->aio_reqs[req_index].iovcnt < mca_fbtl_ime_iov_max ) {
 101             data->aio_reqs[req_index].iovcnt++;
 102         }
 103 
 104         
 105 
 106         else if ( i+1 != fh->f_num_of_io_entries ) {
 107             req_index++;
 108             data->aio_reqs[req_index].iovcnt = 0;
 109         }
 110     }
 111 
 112     
 113     data->aio_req_count = req_index + 1;
 114     data->aio_open_reqs = req_index + 1;
 115     data->aio_first_active_req = 0;
 116     if ( data->aio_req_count > data->aio_req_chunks ) {
 117         data->aio_last_active_req = data->aio_req_chunks;
 118     }
 119     else {
 120         data->aio_last_active_req = data->aio_req_count;
 121     }
 122 
 123     
 124 
 125 
 126 
 127 
 128 
 129 
 130     for (i=0; i < data->aio_last_active_req; i++) {
 131         switch(io_op) {
 132 
 133         case FBTL_IME_READ:
 134             ret = ime_native_aio_read(&data->aio_reqs[i]);
 135             if (ret < 0) {
 136                 opal_output(1, "mca_fbtl_ime_nonblocking_op: error in "
 137                                "ime_native_aio_read() error ret=%d  %s",
 138                                ret, strerror(errno));
 139                 data->aio_req_status[i] = FBTL_IME_REQ_ERROR;
 140                 data->aio_last_active_req = i + 1;
 141                 goto standard_exit;
 142             }
 143             break;
 144 
 145         case FBTL_IME_WRITE:
 146             ret = ime_native_aio_write(&data->aio_reqs[i]);
 147             if (ret < 0) {
 148                 opal_output(1, "mca_fbtl_ime_nonblocking_op: error in "
 149                                "ime_native_aio_write() error ret=%d  %s",
 150                                ret, strerror(errno));
 151                 data->aio_req_status[i] = FBTL_IME_REQ_ERROR;
 152                 data->aio_last_active_req = i + 1;
 153                 goto standard_exit;
 154             }
 155             break;
 156 
 157         default:
 158             opal_output(1, "mca_fbtl_ime_nonblocking_op: an unsupported "
 159                            "IO operation was requested. io_op=%d", io_op);
 160             goto error_exit;
 161         }
 162     }
 163 
 164 standard_exit:
 165     req->req_data = data;
 166     req->req_progress_fn = mca_fbtl_ime_progress;
 167     req->req_free_fn     = mca_fbtl_ime_request_free;
 168 
 169     return OMPI_SUCCESS;
 170 
 171 error_exit:
 172     free(data->allocated_data);
 173     free(data);
 174     return OMPI_ERROR;
 175 }