-- Done with get support
-- To setup a shared completion queue, for now, separate from receive queue This commit was SVN r2253.
Этот коммит содержится в:
родитель
043a8dc3b4
Коммит
0402f520bc
@ -110,7 +110,9 @@ mca_ptl_elan_last_frag (struct mca_ptl_elan_module_t *ptl,
|
||||
request, request->req_base.req_addr,
|
||||
hdr->hdr_frag.hdr_frag_length);
|
||||
|
||||
ptl->super.ptl_recv_progress (ptl, request,
|
||||
ptl->super.ptl_recv_progress (
|
||||
(mca_ptl_base_module_t *) ptl,
|
||||
request,
|
||||
hdr->hdr_frag.hdr_frag_length,
|
||||
hdr->hdr_frag.hdr_frag_length);
|
||||
|
||||
@ -292,19 +294,13 @@ mca_ptl_elan_init_putget_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
int size_out;
|
||||
int size_in;
|
||||
int rc = OMPI_SUCCESS;
|
||||
|
||||
ELAN4_CTX *ctx;
|
||||
|
||||
struct ompi_ptl_elan_putget_desc_t * desc;
|
||||
|
||||
mca_ptl_base_header_t *hdr;
|
||||
|
||||
START_FUNC((PTL_ELAN_DEBUG_PUT | PTL_ELAN_DEBUG_GET));
|
||||
|
||||
LOG_PRINT((PTL_ELAN_DEBUG_PUT|PTL_ELAN_DEBUG_GET),
|
||||
" frag %p ptl %p ptl_peer %p req %p "
|
||||
"offset %d size %d flags %d \n",
|
||||
frag, ptl, ptl_peer, pml_req, offset, *size, flags);
|
||||
|
||||
hdr = &frag->frag_base.frag_header;
|
||||
desc = (ompi_ptl_elan_putget_desc_t *)frag->desc;
|
||||
destvp = ptl_peer->peer_vp;
|
||||
@ -320,11 +316,9 @@ mca_ptl_elan_init_putget_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
hdr->hdr_frag.hdr_src_ptr.pval = frag; /* No need to hook a frag */
|
||||
hdr->hdr_frag.hdr_dst_ptr = pml_req->req_peer_match;
|
||||
hdr->hdr_frag.hdr_frag_length = size_in;
|
||||
|
||||
desc->src_elan_addr = elan4_main2elan (ctx, pml_req->req_base.req_addr);
|
||||
desc->dst_elan_addr = (E4_Addr)pml_req->req_peer_addr.lval;
|
||||
desc->desc_buff = hdr;
|
||||
|
||||
LOG_PRINT(PTL_ELAN_DEBUG_PUT, " remote req %p addr %x, length %d\n",
|
||||
pml_req->req_peer_match.pval,
|
||||
pml_req->req_peer_addr.lval,
|
||||
@ -461,87 +455,28 @@ mca_ptl_elan_init_get_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
int destvp;
|
||||
int size_out;
|
||||
int size_in;
|
||||
int rc = OMPI_SUCCESS;
|
||||
ELAN4_CTX *ctx;
|
||||
struct ompi_ptl_elan_putget_desc_t * desc;
|
||||
mca_ptl_base_header_t *hdr;
|
||||
|
||||
START_FUNC(PTL_ELAN_DEBUG_GET);
|
||||
|
||||
LOG_PRINT((PTL_ELAN_DEBUG_PUT|PTL_ELAN_DEBUG_GET),
|
||||
"frag %p ptl %p ptl_peer %p req %p "
|
||||
"offset %d size %d flags %d \n",
|
||||
frag, ptl, ptl_peer, pml_req, offset, *size, flags);
|
||||
|
||||
ctx = ptl->ptl_elan_ctx;
|
||||
hdr = &frag->frag_base.frag_header;
|
||||
desc = (ompi_ptl_elan_putget_desc_t *)frag->desc;
|
||||
destvp = ptl_peer->peer_vp;
|
||||
size_in = *size;
|
||||
|
||||
hdr->hdr_common.hdr_type = MCA_PTL_HDR_TYPE_FIN;
|
||||
hdr->hdr_common.hdr_flags = flags;
|
||||
hdr->hdr_common.hdr_size = sizeof(mca_ptl_base_frag_header_t);
|
||||
hdr->hdr_frag.hdr_frag_offset = offset;
|
||||
hdr->hdr_frag.hdr_frag_seq = 0;
|
||||
hdr->hdr_frag.hdr_src_ptr.lval = 0;
|
||||
hdr->hdr_frag.hdr_src_ptr.pval = frag; /* No need to hook a frag */
|
||||
hdr->hdr_frag.hdr_dst_ptr = pml_req->req_peer_match;
|
||||
hdr->hdr_frag.hdr_frag_length = size_in;
|
||||
|
||||
desc->src_elan_addr = elan4_main2elan (ctx, pml_req->req_base.req_addr);
|
||||
desc->dst_elan_addr = (E4_Addr)pml_req->req_peer_addr.lval;
|
||||
desc->src_elan_addr = elan4_main2elan(ctx, pml_req->req_base.req_addr);
|
||||
desc->dst_elan_addr = 0; // (E4_Addr)pml_req->req_peer_addr.lval;
|
||||
desc->desc_buff = hdr;
|
||||
|
||||
LOG_PRINT(PTL_ELAN_DEBUG_PUT, " remote req %p addr %x, length %d\n",
|
||||
pml_req->req_peer_match.pval,
|
||||
pml_req->req_peer_addr.lval,
|
||||
pml_req->req_peer_size);
|
||||
|
||||
/* FIXME: initialize convertor and get the fragment copied out */
|
||||
if(size_in > 0 && 0) {
|
||||
struct iovec iov;
|
||||
ompi_convertor_t *convertor;
|
||||
|
||||
if( offset <= mca_ptl_elan_module.super.ptl_first_frag_size) {
|
||||
convertor = &pml_req->req_convertor;
|
||||
} else {
|
||||
convertor = &frag->frag_base.frag_convertor;
|
||||
ompi_convertor_copy(&pml_req->req_convertor, convertor);
|
||||
ompi_convertor_init_for_send(
|
||||
convertor,
|
||||
0,
|
||||
pml_req->req_base.req_datatype,
|
||||
pml_req->req_base.req_count,
|
||||
pml_req->req_base.req_addr,
|
||||
offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* For now, eager sends are always packed into the descriptor
|
||||
* Inline up to 256 bytes (including the header), then
|
||||
* do a chained send for mesg < first_frag_size */
|
||||
|
||||
/*desc->src_elan_addr = elan4_main2elan(ctx, desc->desc_buff);*/
|
||||
iov.iov_base = desc->desc_buff;
|
||||
iov.iov_len = size_in;
|
||||
|
||||
rc = ompi_convertor_pack(convertor, &iov, 1);
|
||||
if (rc < 0) {
|
||||
ompi_output (0, "[%s:%d] Unable to pack data\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
size_out = iov.iov_len;
|
||||
} else {
|
||||
size_out = size_in;
|
||||
}
|
||||
|
||||
/* FIXME:
|
||||
* initialize convertor and get the fragment copied out
|
||||
* use the convertor hanged over request */
|
||||
size_out = size_in;
|
||||
*size = size_out;
|
||||
hdr->hdr_frag.hdr_frag_length = size_out;
|
||||
|
||||
/* Setup the chain dma */
|
||||
desc->chain_dma.dma_typeSize = E4_DMA_TYPE_SIZE (
|
||||
sizeof(mca_ptl_base_frag_header_t),
|
||||
DMA_DataTypeByte, DMA_QueueWrite, 8);
|
||||
@ -551,17 +486,11 @@ mca_ptl_elan_init_get_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
desc->chain_dma.dma_srcAddr = elan4_main2elan (ctx, (void *) hdr);
|
||||
desc->chain_dma.dma_dstAddr = 0x0ULL;
|
||||
desc->chain_dma.dma_srcEvent = elan4_main2elan (ctx, desc->elan_event);
|
||||
|
||||
/* causes the inputter to redirect the dma to the inputq */
|
||||
desc->chain_dma.dma_dstEvent = elan4_main2elan (ctx,
|
||||
(void *) ptl->queue->input);
|
||||
|
||||
INITEVENT_WORD (ctx, (E4_Event *) desc->elan_event, &desc->main_doneWord);
|
||||
RESETEVENT_WORD (&desc->main_doneWord);
|
||||
|
||||
/* Be sure that padding E4_Event is not causing problems */
|
||||
PRIMEEVENT_WORD (ctx, (E4_Event *)desc->elan_event, 1);
|
||||
|
||||
desc->chain_dma.dma_typeSize |= RUN_DMA_CMD;
|
||||
desc->chain_dma.dma_pad = NOP_CMD;
|
||||
|
||||
@ -583,15 +512,15 @@ mca_ptl_elan_init_get_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
|
||||
/* XXX: The chain dma will go directly into a command stream
|
||||
* so we need addend the command queue control bits.
|
||||
* Allocate space from command queues hanged off the CTX.
|
||||
*/
|
||||
* Allocate space from command queues hanged off the CTX. */
|
||||
desc->chain_event->ev_Params[1] = elan4_alloccq_space (ctx, 8, CQ_Size8K);
|
||||
|
||||
/* FIXME: Find the correct addresses to fill in */
|
||||
desc->main_dma.dma_srcAddr = desc->src_elan_addr;
|
||||
desc->main_dma.dma_dstAddr = desc->dst_elan_addr;
|
||||
desc->main_dma.dma_dstEvent= 0x0ULL; /*disable remote event */
|
||||
|
||||
desc->main_dma.dma_srcEvent= 0x0ULL; /*disable remote event */
|
||||
/* Chain an event */
|
||||
desc->main_dma.dma_srcEvent= elan4_main2elan(ctx,
|
||||
desc->main_dma.dma_dstEvent= elan4_main2elan(ctx,
|
||||
(E4_Event *)desc->chain_event);
|
||||
|
||||
/* FIXME: no additional flags for the DMA, remote, shmem, qwrite,
|
||||
@ -599,25 +528,21 @@ mca_ptl_elan_init_get_desc (struct mca_ptl_elan_send_frag_t *frag,
|
||||
flags = 0;
|
||||
desc->main_dma.dma_typeSize = E4_DMA_TYPE_SIZE (size_out,
|
||||
DMA_DataTypeByte, flags, ptl->putget->pg_retryCount);
|
||||
desc->main_dma.dma_cookie = elan4_local_cookie (
|
||||
desc->main_dma.dma_cookie = elan4_remote_cookie(
|
||||
ptl->putget->pg_cpool,
|
||||
E4_COOKIE_TYPE_LOCAL_DMA,
|
||||
E4_COOKIE_TYPE_REMOTE_DMA,
|
||||
destvp);
|
||||
desc->main_dma.dma_vproc = destvp;
|
||||
|
||||
desc->main_dma.dma_vproc = ptl->elan_vp; /* target is self */
|
||||
LOG_PRINT(PTL_ELAN_DEBUG_MAC,
|
||||
"destvp %d type %d flag %d size %d\n",
|
||||
destvp, hdr->hdr_common.hdr_type,
|
||||
hdr->hdr_common.hdr_flags,
|
||||
hdr->hdr_common.hdr_size);
|
||||
|
||||
/* Make main memory coherent with IO domain (IA64) */
|
||||
MEMBAR_VISIBLE ();
|
||||
END_FUNC(PTL_ELAN_DEBUG_SEND);
|
||||
}
|
||||
|
||||
int
|
||||
mca_ptl_elan_start_get (mca_ptl_elan_send_frag_t * desc,
|
||||
mca_ptl_elan_start_get (mca_ptl_elan_send_frag_t * frag,
|
||||
struct mca_ptl_elan_peer_t *ptl_peer,
|
||||
struct mca_pml_base_recv_request_t *req,
|
||||
size_t offset,
|
||||
@ -629,21 +554,21 @@ mca_ptl_elan_start_get (mca_ptl_elan_send_frag_t * desc,
|
||||
|
||||
START_FUNC(PTL_ELAN_DEBUG_SEND);
|
||||
ptl = ptl_peer->peer_ptl;
|
||||
gdesc = (ompi_ptl_elan_putget_desc_t *)desc->desc;
|
||||
gdesc = (ompi_ptl_elan_putget_desc_t *)frag->desc;
|
||||
/*mca_ptl_elan_init_putget_desc */
|
||||
mca_ptl_elan_init_get_desc (desc, ptl, ptl_peer,
|
||||
sendreq, offset, size, flags);
|
||||
mca_ptl_elan_init_get_desc (frag, ptl, ptl_peer,
|
||||
req, offset, size, flags);
|
||||
elan4_run_dma_cmd (ptl->putget->get_cmdq, (E4_DMA *) &gdesc->main_dma);
|
||||
elan4_flush_cmdq_reorder (ptl->putget->get_cmdq);
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) desc);
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) frag);
|
||||
|
||||
desc->frag_base.frag_owner = (struct mca_ptl_base_module_t *)
|
||||
frag->frag_base.frag_owner = (struct mca_ptl_base_module_t *)
|
||||
&ptl_peer->peer_ptl->super;
|
||||
desc->frag_base.frag_peer = (struct mca_ptl_base_peer_t *) ptl_peer;
|
||||
desc->frag_base.frag_addr = NULL;
|
||||
desc->frag_base.frag_size = *size;
|
||||
desc->frag_progressed = 0;
|
||||
desc->frag_ack_pending = 0; /* this is ack for internal elan */
|
||||
frag->frag_base.frag_peer = (struct mca_ptl_base_peer_t *) ptl_peer;
|
||||
frag->frag_base.frag_addr = NULL;
|
||||
frag->frag_base.frag_size = *size;
|
||||
frag->frag_progressed = 0;
|
||||
frag->frag_ack_pending = 0; /* this is ack for internal elan */
|
||||
|
||||
END_FUNC(PTL_ELAN_DEBUG_SEND);
|
||||
return OMPI_SUCCESS;
|
||||
@ -652,7 +577,7 @@ mca_ptl_elan_start_get (mca_ptl_elan_send_frag_t * desc,
|
||||
|
||||
|
||||
int
|
||||
mca_ptl_elan_start_desc (mca_ptl_elan_send_frag_t * desc,
|
||||
mca_ptl_elan_start_desc (mca_ptl_elan_send_frag_t * frag,
|
||||
struct mca_ptl_elan_peer_t *ptl_peer,
|
||||
struct mca_pml_base_send_request_t *sendreq,
|
||||
size_t offset,
|
||||
@ -665,28 +590,28 @@ mca_ptl_elan_start_desc (mca_ptl_elan_send_frag_t * desc,
|
||||
|
||||
START_FUNC(PTL_ELAN_DEBUG_SEND);
|
||||
|
||||
if (desc->desc->desc_type == MCA_PTL_ELAN_DESC_QDMA) {
|
||||
if (frag->desc->desc_type == MCA_PTL_ELAN_DESC_QDMA) {
|
||||
struct ompi_ptl_elan_qdma_desc_t *qdma;
|
||||
|
||||
qdma = (ompi_ptl_elan_qdma_desc_t *)desc->desc;
|
||||
mca_ptl_elan_init_qdma_desc (desc, ptl, ptl_peer,
|
||||
qdma = (ompi_ptl_elan_qdma_desc_t *)frag->desc;
|
||||
mca_ptl_elan_init_qdma_desc (frag, ptl, ptl_peer,
|
||||
sendreq, offset, size, flags);
|
||||
elan4_run_dma_cmd (ptl->queue->tx_cmdq, (DMA *) & qdma->main_dma);
|
||||
elan4_flush_cmdq_reorder (ptl->queue->tx_cmdq);
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) desc);
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) frag);
|
||||
|
||||
} else if (MCA_PTL_ELAN_DESC_PUT == desc->desc->desc_type) {
|
||||
} else if (MCA_PTL_ELAN_DESC_PUT == frag->desc->desc_type) {
|
||||
|
||||
struct ompi_ptl_elan_putget_desc_t *pdesc;
|
||||
|
||||
pdesc = (ompi_ptl_elan_putget_desc_t *)desc->desc;
|
||||
mca_ptl_elan_init_putget_desc (desc, ptl, ptl_peer, sendreq,
|
||||
pdesc = (ompi_ptl_elan_putget_desc_t *)frag->desc;
|
||||
mca_ptl_elan_init_putget_desc (frag, ptl, ptl_peer, sendreq,
|
||||
offset, size, flags);
|
||||
elan4_run_dma_cmd (ptl->putget->put_cmdq, (E4_DMA *) &pdesc->main_dma);
|
||||
elan4_flush_cmdq_reorder (ptl->putget->put_cmdq);
|
||||
|
||||
/* Insert desc into the list of outstanding DMA's */
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) desc);
|
||||
/* Insert frag into the list of outstanding DMA's */
|
||||
ompi_list_append (&ptl->send_frags, (ompi_list_item_t *) frag);
|
||||
} else {
|
||||
ompi_output (0, "To support GET and Other types of DMA "
|
||||
"are not supported right now \n");
|
||||
@ -694,13 +619,13 @@ mca_ptl_elan_start_desc (mca_ptl_elan_send_frag_t * desc,
|
||||
}
|
||||
|
||||
/* fragment state */
|
||||
desc->frag_base.frag_owner = (struct mca_ptl_base_module_t *)
|
||||
frag->frag_base.frag_owner = (struct mca_ptl_base_module_t *)
|
||||
&ptl_peer->peer_ptl->super;
|
||||
desc->frag_base.frag_peer = (struct mca_ptl_base_peer_t *) ptl_peer;
|
||||
desc->frag_base.frag_addr = NULL;
|
||||
desc->frag_base.frag_size = *size;
|
||||
desc->frag_progressed = 0;
|
||||
desc->frag_ack_pending = 0; /* this is ack for internal elan */
|
||||
frag->frag_base.frag_peer = (struct mca_ptl_base_peer_t *) ptl_peer;
|
||||
frag->frag_base.frag_addr = NULL;
|
||||
frag->frag_base.frag_size = *size;
|
||||
frag->frag_progressed = 0;
|
||||
frag->frag_ack_pending = 0; /* this is ack for internal elan */
|
||||
|
||||
END_FUNC(PTL_ELAN_DEBUG_SEND);
|
||||
return OMPI_SUCCESS;
|
||||
@ -718,42 +643,33 @@ mca_ptl_elan_get_with_ack ( mca_ptl_base_module_t * ptl,
|
||||
mca_pml_base_recv_request_t* request;
|
||||
mca_ptl_elan_module_t *elan_ptl;
|
||||
int destvp;
|
||||
int remain_len, flags;
|
||||
|
||||
START_FUNC(PTL_ELAN_DEBUG_ACK);
|
||||
|
||||
flags = 0; /* XXX: No special flags for get */
|
||||
elan_ptl = (mca_ptl_elan_module_t *) ptl;
|
||||
destvp = ((mca_ptl_elan_peer_t *)
|
||||
recv_frag->frag_recv.frag_base.frag_peer)->peer_vp;
|
||||
frag->desc->desc_type = MCA_PTL_ELAN_DESC_QDMA;
|
||||
gdesc = (ompi_ptl_elan_gdesc_desc_t *)frag->desc;
|
||||
hdr = (mca_ptl_base_header_t *) &frag->frag_base.frag_header;
|
||||
request = recv_frag->frag_recv.frag_request;
|
||||
destvp = ((mca_ptl_elan_peer_t *)
|
||||
recv_frag->frag_recv.frag_base.frag_peer)->peer_vp;
|
||||
frag->desc->desc_type = MCA_PTL_ELAN_DESC_PUT;
|
||||
gdesc = (ompi_ptl_elan_putget_desc_t *)frag->desc;
|
||||
hdr = (mca_ptl_base_header_t *) &frag->frag_base.frag_header;
|
||||
|
||||
/* XXX: since send_frag provides a header inside,
|
||||
* no need to allocate a buffer-equipped QDMA descriptor */
|
||||
hdr->hdr_common.hdr_type = MCA_PTL_HDR_TYPE_ACK;
|
||||
hdr->hdr_common.hdr_flags = 0;
|
||||
* no need to allocate a QDMA descriptor w/ buff */
|
||||
remain_len = request->req_bytes_packed - request->req_bytes_received;
|
||||
hdr->hdr_common.hdr_type = MCA_PTL_HDR_TYPE_FIN;
|
||||
hdr->hdr_common.hdr_flags= 0;
|
||||
hdr->hdr_common.hdr_size = sizeof(mca_ptl_base_ack_header_t);
|
||||
|
||||
/* Remote send fragment descriptor */
|
||||
hdr->hdr_ack.hdr_src_ptr =
|
||||
recv_frag->frag_recv.frag_base.frag_header.hdr_frag.hdr_src_ptr;
|
||||
|
||||
/* Matched request from recv side */
|
||||
hdr->hdr_ack.hdr_dst_match.lval = 0;
|
||||
hdr->hdr_ack.hdr_dst_match.pval = request;
|
||||
|
||||
/* FIXME: this needs to be some offsete from the base addr */
|
||||
hdr->hdr_ack.hdr_dst_addr.pval = 0;
|
||||
hdr->hdr_ack.hdr_dst_addr.lval = elan4_main2elan(
|
||||
elan_ptl->ptl_elan_ctx, request->req_base.req_addr);
|
||||
|
||||
/* FIXME: posted buffer size is the leftover */
|
||||
hdr->hdr_ack.hdr_dst_size =
|
||||
request->req_bytes_packed - request->req_bytes_received;
|
||||
|
||||
/* XXX: No need to set the fragment size */
|
||||
/*hdr->hdr_common.hdr_frag_length = sizeof(mca_ptl_base_ack_header_t);*/
|
||||
hdr->hdr_ack.hdr_dst_size = remain_len;
|
||||
|
||||
LOG_PRINT(PTL_ELAN_DEBUG_ACK,
|
||||
"remote frag %p local req %p buffer %p size %d \n",
|
||||
@ -762,35 +678,29 @@ mca_ptl_elan_get_with_ack ( mca_ptl_base_module_t * ptl,
|
||||
hdr->hdr_ack.hdr_dst_addr.pval,
|
||||
hdr->hdr_ack.hdr_dst_size);
|
||||
|
||||
/* Filling up QDMA descriptor */
|
||||
gdesc->main_dma.dma_srcAddr = elan4_main2elan(
|
||||
elan_ptl->ptl_elan_ctx, &gdesc->buff[0]);
|
||||
mca_ptl_elan_init_get_desc (frag, ptl,
|
||||
recv_frag->frag_recv.frag_base.frag_peer,
|
||||
request, request->req_bytes_received,
|
||||
remain_len, flags);
|
||||
|
||||
/* XXX: Hardcoded DMA retry count */
|
||||
gdesc->main_dma.dma_typeSize = E4_DMA_TYPE_SIZE (
|
||||
sizeof(mca_ptl_base_ack_header_t),
|
||||
DMA_DataTypeByte, DMA_QueueWrite, 16);
|
||||
gdesc->main_dma.dma_vproc = destvp;
|
||||
gdesc->main_dma.dma_cookie = elan4_local_cookie (
|
||||
elan_ptl->queue->tx_cpool,
|
||||
E4_COOKIE_TYPE_LOCAL_DMA, destvp);
|
||||
|
||||
/* Make main memory coherent with IO domain (IA64) */
|
||||
MEMBAR_VISIBLE ();
|
||||
elan4_run_dma_cmd (elan_ptl->queue->tx_cmdq, (DMA *) & gdesc->main_dma);
|
||||
elan4_flush_cmdq_reorder (elan_ptl->queue->tx_cmdq);
|
||||
|
||||
/* Insert frag into the list of outstanding DMA's */
|
||||
/* Trigger a STEN packet to the remote side and then from there
|
||||
* a elan_get is triggered */
|
||||
elan4_remote_dma(elan_ptl->putget->get_cmdq,
|
||||
(E4_DMA *)&gdesc->main_dma, destvp,
|
||||
elan4_local_cookie(elan_ptl->putget->pg_cpool,
|
||||
E4_COOKIE_TYPE_STEN , destvp));
|
||||
elan4_flush_cmdq_reorder (elan_ptl->putget->get_cmdq);
|
||||
MEMBAR_DRAIN();
|
||||
ompi_list_append (&elan_ptl->send_frags, (ompi_list_item_t *) frag);
|
||||
|
||||
/* fragment state */
|
||||
frag->desc->req = NULL;
|
||||
frag->frag_base.frag_owner = ptl;
|
||||
frag->frag_base.frag_peer = recv_frag->frag_recv.frag_base.frag_peer;
|
||||
frag->frag_base.frag_addr = NULL;
|
||||
frag->frag_base.frag_size = 0;
|
||||
frag->frag_progressed = 0;
|
||||
/* XXX: fragment state, remember the recv_frag may be gone */
|
||||
frag->desc->req = (mca_pml_base_request_t *) request ; /*recv req*/
|
||||
frag->desc->desc_status = MCA_PTL_ELAN_DESC_LOCAL;
|
||||
frag->frag_base.frag_owner= ptl;
|
||||
frag->frag_base.frag_peer = recv_frag->frag_recv.frag_base.frag_peer;
|
||||
frag->frag_base.frag_addr = request->req_base.req_addr;/*final buff*/
|
||||
frag->frag_base.frag_size = remain_len;
|
||||
frag->frag_progressed = 0;
|
||||
|
||||
END_FUNC(PTL_ELAN_DEBUG_ACK);
|
||||
return OMPI_SUCCESS;
|
||||
@ -842,9 +752,6 @@ mca_ptl_elan_start_ack ( mca_ptl_base_module_t * ptl,
|
||||
hdr->hdr_ack.hdr_dst_size =
|
||||
request->req_bytes_packed - request->req_bytes_received;
|
||||
|
||||
/* XXX: No need to set the fragment size */
|
||||
/*hdr->hdr_common.hdr_frag_length = sizeof(mca_ptl_base_ack_header_t);*/
|
||||
|
||||
LOG_PRINT(PTL_ELAN_DEBUG_ACK,
|
||||
"remote frag %p local req %p buffer %p size %d \n",
|
||||
hdr->hdr_ack.hdr_src_ptr.pval,
|
||||
@ -1009,12 +916,12 @@ mca_ptl_elan_update_desc (mca_ptl_elan_component_t * emp)
|
||||
rc = elan4_pollevent_word(ctx, &frag->desc->main_doneWord, 1);
|
||||
#endif
|
||||
if (rc) {
|
||||
struct ompi_ptl_elan_base_desc_t *basic;
|
||||
ompi_ptl_elan_base_desc_t *basic;
|
||||
|
||||
/* Remove the desc, update the request, return to free list */
|
||||
frag = (mca_ptl_elan_send_frag_t *)
|
||||
ompi_list_remove_first (&ptl->send_frags);
|
||||
basic = (ompi_ptl_elan_qdma_desc_t*)frag->desc;
|
||||
basic = (ompi_ptl_elan_base_desc_t*)frag->desc;
|
||||
mca_ptl_elan_send_desc_done (frag, basic->req);
|
||||
INITEVENT_WORD (ctx, basic->elan_event, &basic->main_doneWord);
|
||||
RESETEVENT_WORD (&basic->main_doneWord);
|
||||
|
@ -69,7 +69,8 @@
|
||||
#define OMPI_PTL_ELAN_GET_MIN(a,b) ((a<b)? a:b)
|
||||
#define OMPI_PTL_ELAN_ALIGNUP(x,a) (((unsigned int)(x) + ((a)-1)) & (-(a)))
|
||||
|
||||
#define OMPI_PTL_ELAN_ENABLE_GET (0)
|
||||
#define OMPI_PTL_ELAN_ENABLE_GET (1)
|
||||
#define OMPI_PTL_ELAN_QDMA_RETRY (16)
|
||||
|
||||
/* For now only debug send's */
|
||||
#if 1
|
||||
@ -167,7 +168,7 @@ typedef struct ompi_ptl_elan_recv_queue_t ompi_ptl_elan_recv_queue_t;
|
||||
volatile E4_uint64 main_doneWord; \
|
||||
/* 8 byte aligned */ \
|
||||
E4_Event *elan_event; \
|
||||
uint8_t *desc_buff; \
|
||||
void *desc_buff; \
|
||||
/* 8 byte aligned */ \
|
||||
mca_pml_base_request_t *req; \
|
||||
mca_ptl_elan_module_t *ptl; \
|
||||
@ -321,7 +322,8 @@ int ompi_init_elan_stat (mca_ptl_elan_component_t * emp,
|
||||
int num_rails);
|
||||
|
||||
/* communication prototypes */
|
||||
int mca_ptl_elan_start_desc(mca_ptl_elan_send_frag_t *desc,
|
||||
int mca_ptl_elan_start_desc(
|
||||
mca_ptl_elan_send_frag_t *desc,
|
||||
struct mca_ptl_elan_peer_t *ptl_peer,
|
||||
struct mca_pml_base_send_request_t *sendreq,
|
||||
size_t offset,
|
||||
@ -331,6 +333,9 @@ int mca_ptl_elan_start_desc(mca_ptl_elan_send_frag_t *desc,
|
||||
int mca_ptl_elan_start_ack ( mca_ptl_base_module_t * ptl,
|
||||
mca_ptl_elan_send_frag_t * desc,
|
||||
mca_ptl_elan_recv_frag_t * recv_frag);
|
||||
int mca_ptl_elan_get_with_ack (mca_ptl_base_module_t * ptl,
|
||||
mca_ptl_elan_send_frag_t * frag,
|
||||
mca_ptl_elan_recv_frag_t * recv_frag);
|
||||
|
||||
int mca_ptl_elan_poll_desc(mca_ptl_elan_send_frag_t *desc);
|
||||
int mca_ptl_elan_wait_desc(mca_ptl_elan_send_frag_t *desc);
|
||||
@ -338,6 +343,15 @@ int mca_ptl_elan_wait_desc(mca_ptl_elan_send_frag_t *desc);
|
||||
/* control, synchronization and state prototypes */
|
||||
int mca_ptl_elan_drain_recv(mca_ptl_elan_component_t *emp);
|
||||
int mca_ptl_elan_update_desc(mca_ptl_elan_component_t *emp);
|
||||
|
||||
int
|
||||
mca_ptl_elan_start_get (mca_ptl_elan_send_frag_t * frag,
|
||||
struct mca_ptl_elan_peer_t *ptl_peer,
|
||||
struct mca_pml_base_recv_request_t *req,
|
||||
size_t offset,
|
||||
size_t *size,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
* utility routines for parameter registration
|
||||
*/
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user