Skip to content

Commit ebd847d

Browse files
authored
Merge pull request #5437 from kawashima-fj/pr/v3.0.x/pending-bsend-fix
v3.0.x: pml/ob1: Fix data corruption of MPI_BSEND
2 parents 7271143 + 87417ae commit ebd847d

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

ompi/mca/pml/ob1/pml_ob1_sendreq.c

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
1919
* Copyright (c) 2016 Research Organization for Information Science
2020
* and Technology (RIST). All rights reserved.
21+
* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
2122
* $COPYRIGHT$
2223
*
2324
* Additional copyrights may follow
@@ -416,29 +417,31 @@ int mca_pml_ob1_send_request_start_buffered(
416417
des->des_cbfunc = mca_pml_ob1_rndv_completion;
417418
des->des_cbdata = sendreq;
418419

419-
/* buffer the remainder of the message */
420-
rc = mca_pml_base_bsend_request_alloc((ompi_request_t*)sendreq);
421-
if( OPAL_UNLIKELY(OMPI_SUCCESS != rc) ) {
422-
mca_bml_base_free(bml_btl, des);
423-
return rc;
424-
}
420+
/* buffer the remainder of the message if it is not buffered yet */
421+
if( OPAL_LIKELY(sendreq->req_send.req_addr == sendreq->req_send.req_base.req_addr) ) {
422+
rc = mca_pml_base_bsend_request_alloc((ompi_request_t*)sendreq);
423+
if( OPAL_UNLIKELY(OMPI_SUCCESS != rc) ) {
424+
mca_bml_base_free(bml_btl, des);
425+
return rc;
426+
}
425427

426-
iov.iov_base = (IOVBASE_TYPE*)(((unsigned char*)sendreq->req_send.req_addr) + max_data);
427-
iov.iov_len = max_data = sendreq->req_send.req_bytes_packed - max_data;
428+
iov.iov_base = (IOVBASE_TYPE*)(((unsigned char*)sendreq->req_send.req_addr) + max_data);
429+
iov.iov_len = max_data = sendreq->req_send.req_bytes_packed - max_data;
428430

429-
if((rc = opal_convertor_pack( &sendreq->req_send.req_base.req_convertor,
430-
&iov,
431-
&iov_count,
432-
&max_data)) < 0) {
433-
mca_bml_base_free(bml_btl, des);
434-
return rc;
435-
}
431+
if((rc = opal_convertor_pack( &sendreq->req_send.req_base.req_convertor,
432+
&iov,
433+
&iov_count,
434+
&max_data)) < 0) {
435+
mca_bml_base_free(bml_btl, des);
436+
return rc;
437+
}
436438

437-
/* re-init convertor for packed data */
438-
opal_convertor_prepare_for_send( &sendreq->req_send.req_base.req_convertor,
439-
&(ompi_mpi_byte.dt.super),
440-
sendreq->req_send.req_bytes_packed,
441-
sendreq->req_send.req_addr );
439+
/* re-init convertor for packed data */
440+
opal_convertor_prepare_for_send( &sendreq->req_send.req_base.req_convertor,
441+
&(ompi_mpi_byte.dt.super),
442+
sendreq->req_send.req_bytes_packed,
443+
sendreq->req_send.req_addr );
444+
}
442445

443446
/* wait for ack and completion */
444447
sendreq->req_state = 2;

ompi/mca/pml/ob1/pml_ob1_sendreq.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Copyright (c) 2011-2012 NVIDIA Corporation. All rights reserved.
1515
* Copyright (c) 2011-2016 Los Alamos National Security, LLC. All rights
1616
* reserved.
17+
* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
1718
* $COPYRIGHT$
1819
*
1920
* Additional copyrights may follow
@@ -468,6 +469,16 @@ mca_pml_ob1_send_request_start_seq (mca_pml_ob1_send_request_t* sendreq, mca_bml
468469
if( OPAL_LIKELY(OMPI_ERR_OUT_OF_RESOURCE != rc) )
469470
return rc;
470471
}
472+
if(MCA_PML_BASE_SEND_BUFFERED == sendreq->req_send.req_send_mode &&
473+
sendreq->req_send.req_addr == sendreq->req_send.req_base.req_addr) {
474+
/* in the buffered mode, the send buffer must be saved to
475+
* the attached buffer before returning it to the user */
476+
int rc;
477+
rc = mca_pml_base_bsend_request_start((ompi_request_t*)sendreq);
478+
if(OMPI_SUCCESS != rc){
479+
return rc;
480+
}
481+
}
471482
add_request_to_send_pending(sendreq, MCA_PML_OB1_SEND_PENDING_START, true);
472483

473484
return OMPI_SUCCESS;

0 commit comments

Comments
 (0)