void mca_pml_ob1_send_request_process_pending(mca_bml_base_btl_t *bml_btl) { int rc, i, s = opal_list_get_size(&mca_pml_ob1.send_pending); /* advance pending requests */ for(i = 0; i < s; i++) { mca_pml_ob1_send_pending_t pending_type = MCA_PML_OB1_SEND_PENDING_NONE; mca_pml_ob1_send_request_t* sendreq; mca_bml_base_btl_t *send_dst; sendreq = get_request_from_send_pending(&pending_type); if(OPAL_UNLIKELY(NULL == sendreq)) break; switch(pending_type) { case MCA_PML_OB1_SEND_PENDING_SCHEDULE: rc = mca_pml_ob1_send_request_schedule_exclusive(sendreq); if(OMPI_ERR_OUT_OF_RESOURCE == rc) { return; } break; case MCA_PML_OB1_SEND_PENDING_START: send_dst = mca_bml_base_btl_array_find( &sendreq->req_endpoint->btl_eager, bml_btl->btl); if (NULL == send_dst) { /* Put request back onto pending list and try next one. */ add_request_to_send_pending(sendreq, MCA_PML_OB1_SEND_PENDING_START, true); } else { MCA_PML_OB1_SEND_REQUEST_RESET(sendreq); rc = mca_pml_ob1_send_request_start_btl(sendreq, send_dst); if (OMPI_ERR_OUT_OF_RESOURCE == rc) { /* No more resources on this btl so prepend to the pending * list to minimize reordering and give up for now. */ add_request_to_send_pending(sendreq, MCA_PML_OB1_SEND_PENDING_START, false); return; } } break; default: opal_output(0, "[%s:%d] wrong send request type\n", __FILE__, __LINE__); break; } } }
void mca_pml_ob1_process_pending_packets(mca_bml_base_btl_t* bml_btl) { mca_pml_ob1_pckt_pending_t *pckt; int32_t i, rc, s = (int32_t)opal_list_get_size(&mca_pml_ob1.pckt_pending); for(i = 0; i < s; i++) { mca_bml_base_btl_t *send_dst = NULL; OPAL_THREAD_LOCK(&mca_pml_ob1.lock); pckt = (mca_pml_ob1_pckt_pending_t*) opal_list_remove_first(&mca_pml_ob1.pckt_pending); OPAL_THREAD_UNLOCK(&mca_pml_ob1.lock); if(NULL == pckt) break; if(pckt->bml_btl != NULL && pckt->bml_btl->btl == bml_btl->btl) { send_dst = pckt->bml_btl; } else { mca_bml_base_endpoint_t* endpoint = (mca_bml_base_endpoint_t*) pckt->proc->proc_endpoints[OMPI_PROC_ENDPOINT_TAG_BML]; send_dst = mca_bml_base_btl_array_find( &endpoint->btl_eager, bml_btl->btl); } if(NULL == send_dst) { OPAL_THREAD_LOCK(&mca_pml_ob1.lock); opal_list_append(&mca_pml_ob1.pckt_pending, (opal_list_item_t*)pckt); OPAL_THREAD_UNLOCK(&mca_pml_ob1.lock); continue; } switch(pckt->hdr.hdr_common.hdr_type) { case MCA_PML_OB1_HDR_TYPE_ACK: rc = mca_pml_ob1_recv_request_ack_send_btl(pckt->proc, send_dst, pckt->hdr.hdr_ack.hdr_src_req.lval, pckt->hdr.hdr_ack.hdr_dst_req.pval, pckt->hdr.hdr_ack.hdr_send_offset, pckt->hdr.hdr_common.hdr_flags & MCA_PML_OB1_HDR_FLAGS_NORDMA); if( OPAL_UNLIKELY(OMPI_ERR_OUT_OF_RESOURCE == rc) ) { OPAL_THREAD_LOCK(&mca_pml_ob1.lock); opal_list_append(&mca_pml_ob1.pckt_pending, (opal_list_item_t*)pckt); OPAL_THREAD_UNLOCK(&mca_pml_ob1.lock); return; } break; case MCA_PML_OB1_HDR_TYPE_FIN: rc = mca_pml_ob1_send_fin(pckt->proc, send_dst, pckt->hdr.hdr_fin.hdr_des, pckt->order, pckt->hdr.hdr_fin.hdr_fail); if( OPAL_UNLIKELY(OMPI_ERR_OUT_OF_RESOURCE == rc) ) { return; } break; default: opal_output(0, "[%s:%d] wrong header type\n", __FILE__, __LINE__); break; } /* We're done with this packet, return it back to the free list */ MCA_PML_OB1_PCKT_PENDING_RETURN(pckt); } }