Skip to content

Commit 6424857

Browse files
authored
Merge pull request #6634 from jsquyres/pr/v4.0.x/ob1-fixes
v4.0.x: Cherry pick ob1 fixes from master
2 parents ba2368b + 48f8243 commit 6424857

File tree

6 files changed

+35
-22
lines changed

6 files changed

+35
-22
lines changed

ompi/mca/pml/ob1/pml_ob1_rdmafrag.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
44
* University Research and Technology
55
* Corporation. All rights reserved.
6-
* Copyright (c) 2004-2013 The University of Tennessee and The University
6+
* Copyright (c) 2004-2019 The University of Tennessee and The University
77
* of Tennessee Research Foundation. All rights
88
* reserved.
99
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -46,7 +46,8 @@ struct mca_pml_ob1_rdma_frag_t {
4646
mca_bml_base_btl_t *rdma_bml;
4747
mca_pml_ob1_hdr_t rdma_hdr;
4848
mca_pml_ob1_rdma_state_t rdma_state;
49-
size_t rdma_length;
49+
size_t rdma_length; /* how much the fragment will transfer */
50+
opal_atomic_size_t rdma_bytes_remaining; /* how much is left to be transferred */
5051
void *rdma_req;
5152
uint32_t retries;
5253
mca_pml_ob1_rdma_frag_callback_t cbfunc;
@@ -71,7 +72,6 @@ OBJ_CLASS_DECLARATION(mca_pml_ob1_rdma_frag_t);
7172

7273
#define MCA_PML_OB1_RDMA_FRAG_RETURN(frag) \
7374
do { \
74-
/* return fragment */ \
7575
if (frag->local_handle) { \
7676
mca_bml_base_deregister_mem (frag->rdma_bml, frag->local_handle); \
7777
frag->local_handle = NULL; \

ompi/mca/pml/ob1/pml_ob1_recvfrag.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,6 @@ void mca_pml_ob1_recv_frag_callback_ack(mca_btl_base_module_t* btl,
558558
* then throttle sends */
559559
if(hdr->hdr_common.hdr_flags & MCA_PML_OB1_HDR_FLAGS_NORDMA) {
560560
if (NULL != sendreq->rdma_frag) {
561-
if (NULL != sendreq->rdma_frag->local_handle) {
562-
mca_bml_base_deregister_mem (sendreq->req_rdma[0].bml_btl, sendreq->rdma_frag->local_handle);
563-
sendreq->rdma_frag->local_handle = NULL;
564-
}
565561
MCA_PML_OB1_RDMA_FRAG_RETURN(sendreq->rdma_frag);
566562
sendreq->rdma_frag = NULL;
567563
}

ompi/mca/pml/ob1/pml_ob1_recvreq.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
44
* University Research and Technology
55
* 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
77
* of Tennessee Research Foundation. All rights
88
* reserved.
99
* Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
@@ -313,7 +313,12 @@ static int mca_pml_ob1_recv_request_ack(
313313
return OMPI_SUCCESS;
314314
}
315315

316-
/* let know to shedule function there is no need to put ACK flag */
316+
/* let know to shedule function there is no need to put ACK flag. If not all message went over
317+
* RDMA then we cancel the GET protocol in order to switch back to send/recv. In this case send
318+
* back the remote send request, the peer kept a poointer to the frag locally. In the future we
319+
* might want to cancel the fragment itself, in which case we will have to send back the remote
320+
* fragment instead of the remote request.
321+
*/
317322
recvreq->req_ack_sent = true;
318323
return mca_pml_ob1_recv_request_ack_send(proc, hdr->hdr_src_req.lval,
319324
recvreq, recvreq->req_send_offset, 0,
@@ -402,6 +407,7 @@ static int mca_pml_ob1_recv_request_put_frag (mca_pml_ob1_rdma_frag_t *frag)
402407
#if OPAL_ENABLE_HETEROGENEOUS_SUPPORT
403408
ompi_proc_t* proc = (ompi_proc_t*)recvreq->req_recv.req_base.req_proc;
404409
#endif
410+
mca_btl_base_registration_handle_t *local_handle = NULL;
405411
mca_bml_base_btl_t *bml_btl = frag->rdma_bml;
406412
mca_btl_base_descriptor_t *ctl;
407413
mca_pml_ob1_rdma_hdr_t *hdr;
@@ -410,6 +416,12 @@ static int mca_pml_ob1_recv_request_put_frag (mca_pml_ob1_rdma_frag_t *frag)
410416

411417
reg_size = bml_btl->btl->btl_registration_handle_size;
412418

419+
if (frag->local_handle) {
420+
local_handle = frag->local_handle;
421+
} else if (recvreq->local_handle) {
422+
local_handle = recvreq->local_handle;
423+
}
424+
413425
/* prepare a descriptor for rdma control message */
414426
mca_bml_base_alloc (bml_btl, &ctl, MCA_BTL_NO_ORDER, sizeof (mca_pml_ob1_rdma_hdr_t) + reg_size,
415427
MCA_BTL_DES_FLAGS_PRIORITY | MCA_BTL_DES_FLAGS_BTL_OWNERSHIP |
@@ -423,7 +435,7 @@ static int mca_pml_ob1_recv_request_put_frag (mca_pml_ob1_rdma_frag_t *frag)
423435
hdr = (mca_pml_ob1_rdma_hdr_t *) ctl->des_segments->seg_addr.pval;
424436
mca_pml_ob1_rdma_hdr_prepare (hdr, (!recvreq->req_ack_sent) ? MCA_PML_OB1_HDR_TYPE_ACK : 0,
425437
recvreq->remote_req_send.lval, frag, recvreq, frag->rdma_offset,
426-
frag->local_address, frag->rdma_length, frag->local_handle,
438+
frag->local_address, frag->rdma_length, local_handle,
427439
reg_size);
428440
ob1_hdr_hton(hdr, MCA_PML_OB1_HDR_TYPE_PUT, proc);
429441

@@ -645,7 +657,6 @@ void mca_pml_ob1_recv_request_progress_rget( mca_pml_ob1_recv_request_t* recvreq
645657
int rc;
646658

647659
prev_sent = offset = 0;
648-
bytes_remaining = hdr->hdr_rndv.hdr_msg_length;
649660
recvreq->req_recv.req_bytes_packed = hdr->hdr_rndv.hdr_msg_length;
650661
recvreq->req_send_offset = 0;
651662
recvreq->req_rdma_offset = 0;

ompi/mca/pml/ob1/pml_ob1_sendreq.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
44
* University Research and Technology
55
* 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
77
* of Tennessee Research Foundation. All rights
88
* reserved.
99
* Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
@@ -41,7 +41,6 @@
4141
#include "ompi/mca/bml/base/base.h"
4242
#include "ompi/memchecker.h"
4343

44-
4544
OBJ_CLASS_INSTANCE(mca_pml_ob1_send_range_t, opal_free_list_item_t,
4645
NULL, NULL);
4746

@@ -148,10 +147,7 @@ static void mca_pml_ob1_send_request_destruct(mca_pml_ob1_send_request_t* req)
148147
{
149148
OBJ_DESTRUCT(&req->req_send_ranges);
150149
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 );
155151
}
156152

157153
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)
262258
{
263259
mca_pml_ob1_send_request_t *sendreq = (mca_pml_ob1_send_request_t *) frag->rdma_req;
264260
mca_bml_base_btl_t *bml_btl = frag->rdma_bml;
261+
size_t frag_remaining;
265262

266263
/* count bytes of user data actually delivered and check for request completion */
267264
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);
269266
SPC_USER_OR_MPI(sendreq->req_send.req_base.req_ompi.req_status.MPI_TAG, (ompi_spc_value_t)rdma_length,
270267
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+
}
271275
}
272276

273277
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,
701705
frag->rdma_req = sendreq;
702706
frag->rdma_bml = bml_btl;
703707
frag->rdma_length = size;
708+
frag->rdma_bytes_remaining = size;
704709
frag->cbfunc = mca_pml_ob1_rget_completion;
705710
/* do not store the local handle in the fragment. it will be released by mca_pml_ob1_free_rdma_resources */
706711

ompi/mca/pml/ob1/pml_ob1_sendreq.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,7 @@ static inline void mca_pml_ob1_send_request_fini (mca_pml_ob1_send_request_t *se
216216
{
217217
/* Let the base handle the reference counts */
218218
MCA_PML_BASE_SEND_REQUEST_FINI((&(sendreq)->req_send));
219-
if (sendreq->rdma_frag) {
220-
MCA_PML_OB1_RDMA_FRAG_RETURN (sendreq->rdma_frag);
221-
sendreq->rdma_frag = NULL;
222-
}
219+
assert( NULL == sendreq->rdma_frag );
223220
}
224221

225222
/*

opal/threads/thread_usage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ static inline bool opal_set_using_threads(bool have)
8888
}
8989

9090

91+
// Back-ported from master (2019-05-04) as part of
92+
// a16cf0e4dd6df4dea820fecedd5920df632935b8
93+
typedef volatile size_t opal_atomic_size_t;
94+
9195
/**
9296
* Use an atomic operation for increment/decrement if opal_using_threads()
9397
* indicates that threads are in use by the application or library.

0 commit comments

Comments
 (0)