1
1

Fix hang in receiving into MPI_alloced area.

This code hangs with openib BTL:

int size = 4000000;
sbuf = malloc(size);  
MPI_Alloc_mem(size, MPI_INFO_NULL, &rbuf);

if (rank == 0)
{
    MPI_Recv(rbuf, size, MPI_CHAR, 1, 1, MPI_COMM_WORLD, &stat);
}else{
    MPI_Send(sbuf, size, MPI_CHAR, 0, 1, MPI_COMM_WORLD);
}

This commit was SVN r11613.
Этот коммит содержится в:
Gleb Natapov 2006-09-11 12:18:59 +00:00
родитель 8248252ec6
Коммит 03cda61302
2 изменённых файлов: 8 добавлений и 9 удалений

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

@ -304,7 +304,8 @@ static int mca_pml_ob1_recv_request_ack(
}
}
}
/* let know to shedule function there is no need to put ACK flag */
recvreq->req_ack_sent = true;
return mca_pml_ob1_recv_request_ack_send(proc, hdr->hdr_src_req.pval,
recvreq, recvreq->req_rdma_offset);
}
@ -606,7 +607,6 @@ int mca_pml_ob1_recv_request_schedule_exclusive(
mca_bml_base_endpoint_t* bml_endpoint =
(mca_bml_base_endpoint_t*) proc->proc_bml;
mca_bml_base_btl_t* bml_btl;
bool ack = false;
int num_btl_avail =
mca_bml_base_btl_array_get_size(&bml_endpoint->btl_rdma);
int num_tries = num_btl_avail;
@ -660,11 +660,6 @@ int mca_pml_ob1_recv_request_schedule_exclusive(
num_btl_avail = recvreq->req_rdma_cnt - recvreq->req_rdma_idx;
reg = recvreq->req_rdma[recvreq->req_rdma_idx].btl_reg;
/*
* Send ack to the sender so it can properly complete request
*/
ack = true;
if(++recvreq->req_rdma_idx >= recvreq->req_rdma_cnt)
recvreq->req_rdma_idx = 0;
} else {
@ -749,14 +744,16 @@ int mca_pml_ob1_recv_request_schedule_exclusive(
/* fill in rdma header */
hdr = (mca_pml_ob1_rdma_hdr_t*)ctl->des_src->seg_addr.pval;
hdr->hdr_common.hdr_type = MCA_PML_OB1_HDR_TYPE_PUT;
hdr->hdr_common.hdr_flags = ack ? MCA_PML_OB1_HDR_TYPE_ACK : 0;
hdr->hdr_common.hdr_flags =
(!recvreq->req_ack_sent) ? MCA_PML_OB1_HDR_TYPE_ACK : 0;
hdr->hdr_req = recvreq->req_send;
hdr->hdr_des.pval = dst;
hdr->hdr_rdma_offset = recvreq->req_rdma_offset;
hdr->hdr_seg_cnt = dst->des_dst_cnt;
memcpy(hdr->hdr_segs, dst->des_dst,
dst->des_dst_cnt * sizeof(mca_btl_base_segment_t));
if(!recvreq->req_ack_sent)
recvreq->req_ack_sent = true;
#if OMPI_ENABLE_HETEROGENEOUS_SUPPORT
#ifdef WORDS_BIGENDIAN
hdr->hdr_common.hdr_flags |= MCA_PML_OB1_HDR_FLAGS_NBO;

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

@ -52,6 +52,7 @@ struct mca_pml_ob1_recv_request_t {
uint32_t req_rdma_cnt;
uint32_t req_rdma_idx;
bool req_pending;
bool req_ack_sent; /**< whether ack was sent to the sender */
};
typedef struct mca_pml_ob1_recv_request_t mca_pml_ob1_recv_request_t;
@ -219,6 +220,7 @@ do {
(request)->req_pipeline_depth = 0; \
(request)->req_rdma_idx = 0; \
(request)->req_pending = false; \
(request)->req_ack_sent = false; \
\
MCA_PML_BASE_RECV_START( &(request)->req_recv.req_base ); \
\