|
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