1
1

corrections for handling probe with out of order delivery

- when processing out of order list - reset match to null on each iteration
- check matched request type and if probe - complete probe and queue fragment
  on unexpected list

This commit was SVN r8339.
Этот коммит содержится в:
Tim Woodall 2005-11-30 17:57:59 +00:00
родитель 72bb35a814
Коммит d7c1c23e3f
2 изменённых файлов: 29 добавлений и 14 удалений

Просмотреть файл

@ -475,7 +475,9 @@ int mca_pml_ob1_recv_frag_match(
*/
if( (match->req_recv.req_base.req_type == MCA_PML_REQUEST_PROBE) ) {
/* Match a probe, rollback the next expected sequence number */
/* Matched a probe, rollback the next expected sequence number, as
* it will be incremented in the recursive call
*/
(proc->expected_sequence)--;
OPAL_THREAD_UNLOCK(&comm->matching_lock);
@ -566,7 +568,6 @@ static bool mca_pml_ob1_check_cantmatch_for_match(
int match_found;
uint16_t next_msg_seq_expected, frag_seq;
mca_pml_ob1_recv_frag_t *frag;
mca_pml_ob1_recv_request_t *match = NULL;
bool match_made = false;
/*
@ -599,6 +600,7 @@ static bool mca_pml_ob1_check_cantmatch_for_match(
frag_seq=frag->hdr.hdr_match.hdr_seq;
if (frag_seq == next_msg_seq_expected) {
mca_pml_ob1_match_hdr_t* hdr = &frag->hdr.hdr_match;
mca_pml_ob1_recv_request_t *match = NULL;
/* We're now expecting the next sequence number. */
(proc->expected_sequence)++;
@ -639,24 +641,37 @@ static bool mca_pml_ob1_check_cantmatch_for_match(
/* if match found, process data */
if (match) {
/* associate the receive descriptor with the fragment
* descriptor */
frag->request=match;
/* add this fragment descriptor to the list of
* descriptors to be processed later
/*
* If this was a probe need to queue fragment on unexpected list
*/
if(match_made == false) {
match_made = true;
OBJ_CONSTRUCT(additional_matches, opal_list_t);
if( (match->req_recv.req_base.req_type == MCA_PML_REQUEST_PROBE) ) {
/* complete the probe */
mca_pml_ob1_recv_request_matched_probe(match,frag->btl,frag->segments,frag->num_segments);
/* append fragment to unexpected list */
opal_list_append( &proc->unexpected_frags, (opal_list_item_t *)frag);
} else {
/* associate the receive descriptor with the fragment
* descriptor */
frag->request=match;
/* add this fragment descriptor to the list of
* descriptors to be processed later
*/
if(match_made == false) {
match_made = true;
OBJ_CONSTRUCT(additional_matches, opal_list_t);
}
opal_list_append(additional_matches, (opal_list_item_t *)frag);
}
opal_list_append(additional_matches, (opal_list_item_t *)frag);
} else {
/* if no match found, place on unexpected queue */
opal_list_append( &proc->unexpected_frags, (opal_list_item_t *)frag);
}
/* c_frags_cant_match is not an ordered list, so exit loop

Просмотреть файл

@ -579,7 +579,7 @@ void mca_pml_ob1_recv_request_matched_probe(
break;
}
/* check completion status */
/* set completion status */
OPAL_THREAD_LOCK(&ompi_request_lock);
recvreq->req_recv.req_base.req_ompi.req_status.MPI_TAG = hdr->hdr_match.hdr_tag;
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE = hdr->hdr_match.hdr_src;