Another fix for PML request completion when local network completion can occur
out of order.. Reviewed by Brian.. needs to hit 1.1 This commit was SVN r10353.
Этот коммит содержится в:
родитель
d367dc5d56
Коммит
5d71c149c2
@ -1036,6 +1036,15 @@ static void mca_pml_ob1_put_completion(
|
|||||||
/* check for request completion */
|
/* check for request completion */
|
||||||
if( OPAL_THREAD_ADD_SIZE_T(&sendreq->req_bytes_delivered, frag->rdma_length)
|
if( OPAL_THREAD_ADD_SIZE_T(&sendreq->req_bytes_delivered, frag->rdma_length)
|
||||||
>= sendreq->req_send.req_bytes_packed) {
|
>= sendreq->req_send.req_bytes_packed) {
|
||||||
|
/* bump up the req_state after the last fin was sent..
|
||||||
|
if rndv completion occurs after this (can happen!) then
|
||||||
|
the rndv completion will properly clean up after the request
|
||||||
|
we can't just do this on the first RDMA PUT + ACK ctl message in
|
||||||
|
mca_pml_ob1_send_request_put because then we might fall into sender
|
||||||
|
side scheduleing (pml pipeline protocol) */
|
||||||
|
if(true == sendreq->req_got_put_ack) {
|
||||||
|
MCA_PML_OB1_SEND_REQUEST_ADVANCE_NO_SCHEDULE(sendreq);
|
||||||
|
}
|
||||||
/* if we've got completion on rndv packet */
|
/* if we've got completion on rndv packet */
|
||||||
if (sendreq->req_state == 2) {
|
if (sendreq->req_state == 2) {
|
||||||
MCA_PML_OB1_SEND_REQUEST_PML_COMPLETE(sendreq);
|
MCA_PML_OB1_SEND_REQUEST_PML_COMPLETE(sendreq);
|
||||||
@ -1078,7 +1087,7 @@ void mca_pml_ob1_send_request_put(
|
|||||||
bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_rdma, btl);
|
bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_rdma, btl);
|
||||||
MCA_PML_OB1_RDMA_FRAG_ALLOC(frag, rc);
|
MCA_PML_OB1_RDMA_FRAG_ALLOC(frag, rc);
|
||||||
if(hdr->hdr_common.hdr_flags & MCA_PML_OB1_HDR_TYPE_ACK) {
|
if(hdr->hdr_common.hdr_flags & MCA_PML_OB1_HDR_TYPE_ACK) {
|
||||||
MCA_PML_OB1_SEND_REQUEST_ADVANCE_NO_SCHEDULE(sendreq);
|
sendreq->req_got_put_ack = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(NULL == frag) {
|
if(NULL == frag) {
|
||||||
|
@ -52,6 +52,7 @@ struct mca_pml_ob1_send_request_t {
|
|||||||
size_t req_bytes_delivered;
|
size_t req_bytes_delivered;
|
||||||
size_t req_send_offset;
|
size_t req_send_offset;
|
||||||
size_t req_rdma_offset;
|
size_t req_rdma_offset;
|
||||||
|
bool req_got_put_ack;
|
||||||
mca_pml_ob1_rdma_btl_t req_rdma[MCA_PML_OB1_MAX_RDMA_PER_REQUEST];
|
mca_pml_ob1_rdma_btl_t req_rdma[MCA_PML_OB1_MAX_RDMA_PER_REQUEST];
|
||||||
uint32_t req_rdma_cnt;
|
uint32_t req_rdma_cnt;
|
||||||
};
|
};
|
||||||
@ -144,6 +145,7 @@ do {
|
|||||||
sendreq->req_bytes_delivered = 0; \
|
sendreq->req_bytes_delivered = 0; \
|
||||||
sendreq->req_state = 0; \
|
sendreq->req_state = 0; \
|
||||||
sendreq->req_send_offset = 0; \
|
sendreq->req_send_offset = 0; \
|
||||||
|
sendreq->req_got_put_ack = false; \
|
||||||
sendreq->req_send.req_base.req_sequence = OPAL_THREAD_ADD32( \
|
sendreq->req_send.req_base.req_sequence = OPAL_THREAD_ADD32( \
|
||||||
&comm->procs[sendreq->req_send.req_base.req_peer].send_sequence,1); \
|
&comm->procs[sendreq->req_send.req_base.req_peer].send_sequence,1); \
|
||||||
sendreq->req_endpoint = endpoint; \
|
sendreq->req_endpoint = endpoint; \
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user