|
3 | 3 | * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
4 | 4 | * University Research and Technology
|
5 | 5 | * Corporation. All rights reserved.
|
6 |
| - * Copyright (c) 2004-2018 The University of Tennessee and The University |
| 6 | + * Copyright (c) 2004-2019 The University of Tennessee and The University |
7 | 7 | * of Tennessee Research Foundation. All rights
|
8 | 8 | * reserved.
|
9 | 9 | * Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
|
|
41 | 41 | #include "ompi/mca/bml/base/base.h"
|
42 | 42 | #include "ompi/memchecker.h"
|
43 | 43 |
|
44 |
| - |
45 | 44 | OBJ_CLASS_INSTANCE(mca_pml_ob1_send_range_t, opal_free_list_item_t,
|
46 | 45 | NULL, NULL);
|
47 | 46 |
|
@@ -148,10 +147,7 @@ static void mca_pml_ob1_send_request_destruct(mca_pml_ob1_send_request_t* req)
|
148 | 147 | {
|
149 | 148 | OBJ_DESTRUCT(&req->req_send_ranges);
|
150 | 149 | OBJ_DESTRUCT(&req->req_send_range_lock);
|
151 |
| - if (req->rdma_frag) { |
152 |
| - MCA_PML_OB1_RDMA_FRAG_RETURN(req->rdma_frag); |
153 |
| - req->rdma_frag = NULL; |
154 |
| - } |
| 150 | + assert( NULL == req->rdma_frag ); |
155 | 151 | }
|
156 | 152 |
|
157 | 153 | OBJ_CLASS_INSTANCE( mca_pml_ob1_send_request_t,
|
@@ -262,12 +258,20 @@ mca_pml_ob1_rget_completion (mca_pml_ob1_rdma_frag_t *frag, int64_t rdma_length)
|
262 | 258 | {
|
263 | 259 | mca_pml_ob1_send_request_t *sendreq = (mca_pml_ob1_send_request_t *) frag->rdma_req;
|
264 | 260 | mca_bml_base_btl_t *bml_btl = frag->rdma_bml;
|
| 261 | + size_t frag_remaining; |
265 | 262 |
|
266 | 263 | /* count bytes of user data actually delivered and check for request completion */
|
267 | 264 | if (OPAL_LIKELY(0 < rdma_length)) {
|
268 |
| - OPAL_THREAD_ADD_FETCH_SIZE_T(&sendreq->req_bytes_delivered, (size_t) rdma_length); |
| 265 | + frag_remaining = OPAL_THREAD_SUB_FETCH_SIZE_T(&frag->rdma_bytes_remaining, (size_t)rdma_length); |
269 | 266 | SPC_USER_OR_MPI(sendreq->req_send.req_base.req_ompi.req_status.MPI_TAG, (ompi_spc_value_t)rdma_length,
|
270 | 267 | OMPI_SPC_BYTES_SENT_USER, OMPI_SPC_BYTES_SENT_MPI);
|
| 268 | + |
| 269 | + if( 0 == frag_remaining ) { /* this frag is now completed. Update the request and be done */ |
| 270 | + OPAL_THREAD_ADD_FETCH_SIZE_T(&sendreq->req_bytes_delivered, frag->rdma_length); |
| 271 | + if( sendreq->rdma_frag == frag ) |
| 272 | + sendreq->rdma_frag = NULL; |
| 273 | + MCA_PML_OB1_RDMA_FRAG_RETURN(frag); |
| 274 | + } |
271 | 275 | }
|
272 | 276 |
|
273 | 277 | send_request_pml_complete_check(sendreq);
|
@@ -701,6 +705,7 @@ int mca_pml_ob1_send_request_start_rdma( mca_pml_ob1_send_request_t* sendreq,
|
701 | 705 | frag->rdma_req = sendreq;
|
702 | 706 | frag->rdma_bml = bml_btl;
|
703 | 707 | frag->rdma_length = size;
|
| 708 | + frag->rdma_bytes_remaining = size; |
704 | 709 | frag->cbfunc = mca_pml_ob1_rget_completion;
|
705 | 710 | /* do not store the local handle in the fragment. it will be released by mca_pml_ob1_free_rdma_resources */
|
706 | 711 |
|
|
0 commit comments