1
1

Change some of the bfo code to be more like the

ob1 code.  Create some new macros and functions to handle
some differences.

This commit was SVN r23913.
Этот коммит содержится в:
Rolf vandeVaart 2010-10-19 17:46:51 +00:00
родитель 364fcd8975
Коммит 70fe48698c
8 изменённых файлов: 268 добавлений и 75 удалений

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

@ -469,13 +469,19 @@ static void mca_pml_bfo_fin_completion( mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des,
int status )
{
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*) des->des_context;
/* BFO FAILOVER CODE - begin */
if( OPAL_UNLIKELY(OMPI_SUCCESS != status) ) {
mca_pml_bfo_repost_fin(des);
return;
}
MCA_PML_BFO_CHECK_EAGER_BML_BTL_ON_FIN_COMPLETION(bml_btl, btl, des);
/* BFO FAILOVER CODE - end */
MCA_PML_BFO_PROGRESS_PENDING(btl);
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
/**
@ -531,7 +537,7 @@ int mca_pml_bfo_send_fin( ompi_proc_t* proc,
MCA_PML_BFO_HDR_TYPE_FIN );
if( OPAL_LIKELY( rc >= 0 ) ) {
if( OPAL_LIKELY( 1 == rc ) ) {
MCA_PML_BFO_PROGRESS_PENDING(bml_btl->btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
return OMPI_SUCCESS;
}
@ -540,7 +546,7 @@ int mca_pml_bfo_send_fin( ompi_proc_t* proc,
return OMPI_ERR_OUT_OF_RESOURCE;
}
void mca_pml_bfo_process_pending_packets(struct mca_btl_base_module_t* btl)
void mca_pml_bfo_process_pending_packets(mca_bml_base_btl_t* bml_btl)
{
mca_pml_bfo_pckt_pending_t *pckt;
int32_t i, rc, s = (int32_t)opal_list_get_size(&mca_pml_bfo.pckt_pending);
@ -554,11 +560,11 @@ void mca_pml_bfo_process_pending_packets(struct mca_btl_base_module_t* btl)
if(NULL == pckt)
break;
if(pckt->bml_btl != NULL &&
pckt->bml_btl->btl == btl) {
pckt->bml_btl->btl == bml_btl->btl) {
send_dst = pckt->bml_btl;
} else {
send_dst = mca_bml_base_btl_array_find(
&pckt->proc->proc_bml->btl_eager, btl);
&pckt->proc->proc_bml->btl_eager, bml_btl->btl);
}
if(NULL == send_dst) {
OPAL_THREAD_LOCK(&mca_pml_bfo.lock);

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

@ -233,7 +233,7 @@ int mca_pml_bfo_send_fin(ompi_proc_t* proc, mca_bml_base_btl_t* bml_btl,
* resource unavailability. bml_btl passed to the function doesn't represents
* packet's destination, it represents BTL on which resource was freed, so only
* this BTL should be considered for resending packets */
void mca_pml_bfo_process_pending_packets(struct mca_btl_base_module_t* btl);
void mca_pml_bfo_process_pending_packets(mca_bml_base_btl_t* bml_btl);
/* This function retries failed PUT/GET operations on frag. When RDMA operation
* cannot be accomplished for some reason, frag is put on the rdma_pending list.
@ -241,14 +241,14 @@ void mca_pml_bfo_process_pending_packets(struct mca_btl_base_module_t* btl);
* inside the frag structure */
void mca_pml_bfo_process_pending_rdma(void);
#define MCA_PML_BFO_PROGRESS_PENDING(btl) \
#define MCA_PML_BFO_PROGRESS_PENDING(bml_btl) \
do { \
if(opal_list_get_size(&mca_pml_bfo.pckt_pending)) \
mca_pml_bfo_process_pending_packets(btl); \
mca_pml_bfo_process_pending_packets(bml_btl); \
if(opal_list_get_size(&mca_pml_bfo.recv_pending)) \
mca_pml_bfo_recv_request_process_pending(); \
if(opal_list_get_size(&mca_pml_bfo.send_pending)) \
mca_pml_bfo_send_request_process_pending(btl); \
mca_pml_bfo_send_request_process_pending(bml_btl); \
if(opal_list_get_size(&mca_pml_bfo.rdma_pending)) \
mca_pml_bfo_process_pending_rdma(); \
} while (0)

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

@ -1955,3 +1955,151 @@ void mca_pml_bfo_update_rndv_fields(mca_pml_bfo_hdr_t* hdr,
sendreq->req_send.req_base.req_comm->c_my_rank, (void *)sendreq,
sendreq->req_recv.pval, sendreq->req_send.req_base.req_peer);
}
/**
* The following set of functions are all called when it is determined
* that the cached bml_btl->btl does not match the btl handed back
* by the callback function. This means that the bml_btl array has
* been shuffled and the bml_btl matching the btl has to be found
* back. If it cannot be found, then just find a different one to
* use.
*/
void mca_pml_bfo_update_eager_bml_btl_recv_ctl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des)
{
if ((*bml_btl)->btl != btl) {
mca_pml_bfo_common_hdr_t * common = des->des_src->seg_addr.pval;
mca_pml_bfo_ack_hdr_t* ack; /* ACK header */
mca_pml_bfo_recv_request_t* recvreq;
char *type;
switch (common->hdr_type) {
case MCA_PML_BFO_HDR_TYPE_ACK:
ack = (mca_pml_bfo_ack_hdr_t*)des->des_src->seg_addr.pval;
recvreq = (mca_pml_bfo_recv_request_t*) ack->hdr_dst_req.pval;
type = "ACK";
break;
case MCA_PML_BFO_HDR_TYPE_PUT:
recvreq = des->des_cbdata;
type = "PUT";
break;
}
mca_pml_bfo_find_recvreq_eager_bml_btl(bml_btl, btl, recvreq, type);
}
}
void mca_pml_bfo_find_sendreq_eager_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_send_request_t* sendreq,
char* type)
{
if ((*bml_btl)->btl != btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML does not match BTL, find it back, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, (uint16_t)sendreq->req_send.req_base.req_sequence,
sendreq->req_restartseq, (void *)sendreq,
sendreq->req_recv.pval,
sendreq->req_send.req_base.req_peer);
*bml_btl = mca_bml_base_btl_array_find(&sendreq->req_endpoint->btl_eager, btl);
if (NULL == *bml_btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML is gone, find another one, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, (uint16_t)sendreq->req_send.req_base.req_sequence,
sendreq->req_restartseq, (void *)sendreq,
sendreq->req_recv.pval,
sendreq->req_send.req_base.req_peer);
*bml_btl = mca_bml_base_btl_array_get_next(&sendreq->req_endpoint->btl_eager);
}
}
}
void mca_pml_bfo_find_sendreq_rdma_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_send_request_t* sendreq,
char* type)
{
if ((*bml_btl)->btl != btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML does not match BTL, find it back, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, (uint16_t)sendreq->req_send.req_base.req_sequence,
sendreq->req_restartseq, (void *)sendreq,
sendreq->req_recv.pval,
sendreq->req_send.req_base.req_peer);
*bml_btl = mca_bml_base_btl_array_find(&sendreq->req_endpoint->btl_rdma, btl);
if (NULL == *bml_btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML is gone, find another one, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, (uint16_t)sendreq->req_send.req_base.req_sequence,
sendreq->req_restartseq, (void *)sendreq,
sendreq->req_recv.pval,
sendreq->req_send.req_base.req_peer);
*bml_btl = mca_bml_base_btl_array_get_next(&sendreq->req_endpoint->btl_rdma);
}
}
}
void mca_pml_bfo_find_recvreq_eager_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_recv_request_t* recvreq,
char* type)
{
if ((*bml_btl)->btl != btl) {
ompi_proc_t *proc = (ompi_proc_t*)recvreq->req_recv.req_base.req_proc;
mca_bml_base_endpoint_t* bml_endpoint = (mca_bml_base_endpoint_t*) proc->proc_bml;
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML does not match BTL, find it back, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, recvreq->req_msgseq, recvreq->req_restartseq,
recvreq->remote_req_send.pval, (void *)recvreq,
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE);
*bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_eager, btl);
if (NULL == *bml_btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML is gone, find another one, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, recvreq->req_msgseq, recvreq->req_restartseq,
recvreq->remote_req_send.pval, (void *)recvreq,
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE);
*bml_btl = mca_bml_base_btl_array_get_next(&bml_endpoint->btl_eager);
}
}
}
void mca_pml_bfo_find_recvreq_rdma_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_recv_request_t* recvreq,
char* type)
{
if ((*bml_btl)->btl != btl) {
ompi_proc_t *proc = (ompi_proc_t*)recvreq->req_recv.req_base.req_proc;
mca_bml_base_endpoint_t* bml_endpoint = (mca_bml_base_endpoint_t*) proc->proc_bml;
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML does not match BTL, find it back, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, recvreq->req_msgseq, recvreq->req_restartseq,
recvreq->remote_req_send.pval, (void *)recvreq,
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE);
*bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_rdma, btl);
if (NULL == *bml_btl) {
opal_output_verbose(25, mca_pml_bfo_output,
"%s completion: BML is gone, find another one, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, peer=%d",
type, recvreq->req_msgseq, recvreq->req_restartseq,
recvreq->remote_req_send.pval, (void *)recvreq,
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE);
*bml_btl = mca_bml_base_btl_array_get_next(&bml_endpoint->btl_rdma);
}
}
}

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

@ -78,8 +78,32 @@ int mca_pml_bfo_register_callbacks(void);
void mca_pml_bfo_update_rndv_fields(mca_pml_bfo_hdr_t* hdr,
mca_pml_bfo_send_request_t*, char *type);
void mca_pml_bfo_update_bml_btl(mca_bml_base_btl_t** bml_btl, mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des);
void mca_pml_bfo_find_recvreq_eager_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_recv_request_t* recvreq,
char* type);
void mca_pml_bfo_find_sendreq_eager_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_send_request_t* sendreq,
char* type);
void mca_pml_bfo_find_sendreq_rdma_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_send_request_t* sendreq,
char* type);
void mca_pml_bfo_update_eager_bml_btl_recv_ctl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des);
void mca_pml_bfo_find_recvreq_rdma_bml_btl(mca_bml_base_btl_t** bml_btl,
mca_btl_base_module_t* btl,
mca_pml_bfo_recv_request_t* recvreq,
char* type);
/**
* Four new callbacks for the four new message types.
@ -215,7 +239,6 @@ extern void mca_pml_bfo_recv_frag_callback_recverrnotify( mca_btl_base_module_t
return; \
}
/**
* Macros for pml_bfo_sendreq.c file.
*/
@ -358,6 +381,40 @@ do {
mca_pml_bfo_update_rndv_fields(hdr, sendreq, type); \
}
/* If a bml_btl gets mapped out, then we need to adjust it based
* on the btl from the callback function. These macros are called on
* every callback to make sure things are copacetic.
*/
#define MCA_PML_BFO_CHECK_EAGER_BML_BTL_ON_FIN_COMPLETION(bml_btl, btl, des) \
if (bml_btl->btl != btl) { \
ompi_proc_t *proc = (ompi_proc_t*) des->des_cbdata; \
mca_bml_base_endpoint_t* bml_endpoint = (mca_bml_base_endpoint_t*) proc->proc_bml; \
bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_eager, btl); \
}
#define MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, type) \
if (bml_btl->btl != btl) { \
mca_pml_bfo_find_sendreq_eager_bml_btl(&bml_btl, btl, sendreq, type); \
}
#define MCA_PML_BFO_CHECK_SENDREQ_RDMA_BML_BTL(bml_btl, btl, sendreq, type) \
if (bml_btl->btl != btl) { \
mca_pml_bfo_find_sendreq_rdma_bml_btl(&bml_btl, btl, sendreq, type); \
}
#define MCA_PML_BFO_CHECK_RECVREQ_EAGER_BML_BTL(bml_btl, btl, recvreq, type) \
if (bml_btl->btl != btl) { \
mca_pml_bfo_find_recvreq_eager_bml_btl(&bml_btl, btl, recvreq, type); \
}
#define MCA_PML_BFO_CHECK_RECVREQ_RDMA_BML_BTL(bml_btl, btl, recvreq, type) \
if (bml_btl->btl != btl) { \
mca_pml_bfo_find_recvreq_rdma_bml_btl(&bml_btl, btl, recvreq, type); \
}
#define MCA_PML_BFO_CHECK_RECVREQ_EAGER_BML_BTL_RECV_CTL(bml_btl, btl, des) \
if (bml_btl->btl != btl) { \
mca_pml_bfo_update_eager_bml_btl_recv_ctl(&bml_btl, btl, des); \
}
END_C_DECLS

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

@ -168,13 +168,16 @@ static void mca_pml_bfo_recv_ctl_completion( mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des,
int status )
{
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*)des->des_context;
/* BFO FAILOVER CODE - begin */
if (btl->btl_flags & MCA_BTL_FLAGS_FAILOVER_SUPPORT) {
mca_pml_bfo_check_recv_ctl_completion_status(btl, des, status);
}
MCA_PML_BFO_CHECK_RECVREQ_EAGER_BML_BTL_RECV_CTL(bml_btl, btl, des);
/* BFO FAILOVER CODE - end */
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
/*
@ -200,6 +203,7 @@ static void mca_pml_bfo_put_completion( mca_btl_base_module_t* btl,
/* BFO FAILOVER CODE - begin */
MCA_PML_BFO_ERROR_CHECK_ON_FIN_FOR_PUT(recvreq);
MCA_PML_BFO_CHECK_RECVREQ_EAGER_BML_BTL(bml_btl, btl, recvreq, "PUT");
/* BFO FAILOVER CODE - end */
/* check completion status */
@ -209,7 +213,7 @@ static void mca_pml_bfo_put_completion( mca_btl_base_module_t* btl,
/* schedule additional rdma operations */
mca_pml_bfo_recv_request_schedule(recvreq, bml_btl);
}
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
/*
@ -341,7 +345,6 @@ static void mca_pml_bfo_rget_completion( mca_btl_base_module_t* btl,
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*)des->des_context;
mca_pml_bfo_rdma_frag_t* frag = (mca_pml_bfo_rdma_frag_t*)des->des_cbdata;
mca_pml_bfo_recv_request_t* recvreq = (mca_pml_bfo_recv_request_t*)frag->rdma_req;
mca_bml_base_endpoint_t* bml_endpoint;
/* BFO FAILOVER CODE - begin */
if (btl->btl_flags & MCA_BTL_FLAGS_FAILOVER_SUPPORT) {
@ -357,24 +360,7 @@ static void mca_pml_bfo_rget_completion( mca_btl_base_module_t* btl,
/* BFO FAILOVER CODE - begin */
MCA_PML_BFO_SECOND_ERROR_CHECK_ON_RDMA_READ_COMPLETION(recvreq, status, btl);
/* BFO FAILOVER CODE - end */
/* BFO FAILOVER CODE - begin */
/* Find back the bml_btl that this btl belongs to. If we cannot
* find it, then it may have been removed from underneath us, so
* find the next available one to send the FIN message on. */
bml_endpoint = recvreq->req_recv.req_base.req_proc->proc_bml;
bml_btl = mca_bml_base_btl_array_find(&bml_endpoint->btl_rdma, btl);
if( OPAL_UNLIKELY(NULL == bml_btl) ) {
opal_output_verbose(20, mca_pml_bfo_output,
"RDMA write completion: BML was removed from underneath us, "
"PML=%d, RQS=%d, src_req=%lx, dst_req=%lx, status=%d, peer=%d",
recvreq->req_msgseq, recvreq->req_restartseq,
(unsigned long)recvreq->remote_req_send.pval,
(unsigned long)recvreq, status,
recvreq->req_recv.req_base.req_ompi.req_status.MPI_SOURCE);
bml_btl = mca_bml_base_btl_array_get_next(&bml_endpoint->btl_rdma);
}
MCA_PML_BFO_CHECK_RECVREQ_RDMA_BML_BTL(bml_btl, btl, recvreq, "RDMA write");
/* BFO FAILOVER CODE - end */
mca_pml_bfo_send_fin(recvreq->req_recv.req_base.req_proc,
@ -390,7 +376,7 @@ static void mca_pml_bfo_rget_completion( mca_btl_base_module_t* btl,
MCA_PML_BFO_RDMA_FRAG_RETURN(frag);
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
@ -744,7 +730,7 @@ void mca_pml_bfo_recv_request_matched_probe( mca_pml_bfo_recv_request_t* recvreq
*/
int mca_pml_bfo_recv_request_schedule_once( mca_pml_bfo_recv_request_t* recvreq,
mca_btl_base_module_t *start_btl )
mca_bml_base_btl_t *start_bml_btl )
{
mca_bml_base_btl_t* bml_btl;
int num_tries = recvreq->req_rdma_cnt, num_fail = 0;
@ -753,9 +739,9 @@ int mca_pml_bfo_recv_request_schedule_once( mca_pml_bfo_recv_request_t* recvreq,
recvreq->req_rdma_offset;
/* if starting bml_btl is provided schedule next fragment on it first */
if(start_btl != NULL) {
if(start_bml_btl != NULL) {
for(i = 0; i < recvreq->req_rdma_cnt; i++) {
if(recvreq->req_rdma[i].bml_btl->btl != start_btl)
if(recvreq->req_rdma[i].bml_btl != start_bml_btl)
continue;
/* something left to be send? */
if( OPAL_LIKELY(recvreq->req_rdma[i].length) )

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

@ -357,7 +357,7 @@ void mca_pml_bfo_recv_request_matched_probe(
*/
int mca_pml_bfo_recv_request_schedule_once(
mca_pml_bfo_recv_request_t* req, mca_btl_base_module_t* start_btl);
mca_pml_bfo_recv_request_t* req, mca_bml_base_btl_t* start_bml_btl);
static inline int mca_pml_bfo_recv_request_schedule_exclusive(
mca_pml_bfo_recv_request_t* req,
@ -366,7 +366,7 @@ static inline int mca_pml_bfo_recv_request_schedule_exclusive(
int rc;
do {
rc = mca_pml_bfo_recv_request_schedule_once(req, start_bml_btl ? start_bml_btl->btl : NULL);
rc = mca_pml_bfo_recv_request_schedule_once(req, start_bml_btl);
if(OPAL_SOS_GET_ERROR_CODE(rc) == OMPI_ERR_OUT_OF_RESOURCE)
break;
} while(!unlock_recv_request(req));

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

@ -40,7 +40,7 @@
OBJ_CLASS_INSTANCE(mca_pml_bfo_send_range_t, ompi_free_list_item_t,
NULL, NULL);
void mca_pml_bfo_send_request_process_pending(struct mca_btl_base_module_t *btl)
void mca_pml_bfo_send_request_process_pending(mca_bml_base_btl_t *bml_btl)
{
int rc, i, s = opal_list_get_size(&mca_pml_bfo.send_pending);
@ -63,7 +63,7 @@ void mca_pml_bfo_send_request_process_pending(struct mca_btl_base_module_t *btl)
break;
case MCA_PML_BFO_SEND_PENDING_START:
send_dst = mca_bml_base_btl_array_find(
&sendreq->req_endpoint->btl_eager, btl);
&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,
@ -157,7 +157,7 @@ OBJ_CLASS_INSTANCE( mca_pml_bfo_send_request_t,
*/
static inline void
mca_pml_bfo_match_completion_free_request( struct mca_btl_base_module_t* btl,
mca_pml_bfo_match_completion_free_request( mca_bml_base_btl_t* bml_btl,
mca_pml_bfo_send_request_t* sendreq )
{
if( sendreq->req_send.req_bytes_packed > 0 ) {
@ -169,7 +169,7 @@ mca_pml_bfo_match_completion_free_request( struct mca_btl_base_module_t* btl,
send_request_pml_complete(sendreq);
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
static void
@ -179,6 +179,7 @@ mca_pml_bfo_match_completion_free( struct mca_btl_base_module_t* btl,
int status )
{
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)des->des_cbdata;
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*) des->des_context;
/* check completion status */
if( OPAL_UNLIKELY(OMPI_SUCCESS != status) ) {
@ -187,11 +188,12 @@ mca_pml_bfo_match_completion_free( struct mca_btl_base_module_t* btl,
return;
/* BFO FAILOVER CODE - end */
}
mca_pml_bfo_match_completion_free_request( btl, sendreq );
MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, "MATCH");
mca_pml_bfo_match_completion_free_request( bml_btl, sendreq );
}
static inline void
mca_pml_bfo_rndv_completion_request( struct mca_btl_base_module_t* btl,
mca_pml_bfo_rndv_completion_request( mca_bml_base_btl_t* bml_btl,
mca_pml_bfo_send_request_t* sendreq,
size_t req_bytes_delivered )
{
@ -208,7 +210,7 @@ mca_pml_bfo_rndv_completion_request( struct mca_btl_base_module_t* btl,
send_request_pml_complete_check(sendreq);
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
/*
@ -222,6 +224,7 @@ mca_pml_bfo_rndv_completion( mca_btl_base_module_t* btl,
int status )
{
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)des->des_cbdata;
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*)des->des_context;
size_t req_bytes_delivered = 0;
/* check completion status */
@ -243,7 +246,8 @@ mca_pml_bfo_rndv_completion( mca_btl_base_module_t* btl,
sizeof(mca_pml_bfo_rendezvous_hdr_t),
req_bytes_delivered );
mca_pml_bfo_rndv_completion_request( btl, sendreq, req_bytes_delivered );
MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, "RNDV");
mca_pml_bfo_rndv_completion_request( bml_btl, sendreq, req_bytes_delivered );
}
@ -258,6 +262,7 @@ mca_pml_bfo_rget_completion( mca_btl_base_module_t* btl,
int status )
{
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)des->des_cbdata;
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*)des->des_context;
size_t req_bytes_delivered = 0;
MCA_PML_BFO_CHECK_SENDREQ_ERROR_ON_RGET_COMPLETION(sendreq, btl, des);
@ -270,7 +275,8 @@ mca_pml_bfo_rget_completion( mca_btl_base_module_t* btl,
send_request_pml_complete_check(sendreq);
/* free the descriptor */
btl->btl_free(btl, des);
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_CHECK_SENDREQ_RDMA_BML_BTL(bml_btl, btl, sendreq, "RGET");
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
@ -284,10 +290,14 @@ mca_pml_bfo_send_ctl_completion( mca_btl_base_module_t* btl,
struct mca_btl_base_descriptor_t* des,
int status )
{
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*) des->des_context;
/* BFO FAILOVER CODE - begin */
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)des->des_cbdata;
if(OPAL_LIKELY(OMPI_SUCCESS == status)) {
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, "ACK or RGET");
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
} else {
MCA_PML_BFO_ERROR_ON_SEND_CTL_COMPLETION(sendreq, des);
}
@ -305,6 +315,7 @@ mca_pml_bfo_frag_completion( mca_btl_base_module_t* btl,
int status )
{
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)des->des_cbdata;
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*) des->des_context;
size_t req_bytes_delivered = 0;
/* BFO FAILOVER CODE - begin */
sendreq->req_events--;
@ -371,7 +382,8 @@ mca_pml_bfo_frag_completion( mca_btl_base_module_t* btl,
}
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, "FRAG");
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
/**
@ -473,7 +485,7 @@ int mca_pml_bfo_send_request_start_buffered(
rc = mca_bml_base_send(bml_btl, des, MCA_PML_BFO_HDR_TYPE_RNDV);
if( OPAL_LIKELY( rc >= 0 ) ) {
if( OPAL_LIKELY( 1 == rc ) ) {
mca_pml_bfo_rndv_completion_request( bml_btl->btl, sendreq, req_bytes_delivered);
mca_pml_bfo_rndv_completion_request( bml_btl, sendreq, req_bytes_delivered);
}
/* BFO FAILOVER CODE - begin */
if (des->des_flags & MCA_BTL_DES_SEND_ALWAYS_CALLBACK) {
@ -537,7 +549,7 @@ int mca_pml_bfo_send_request_start_copy( mca_pml_bfo_send_request_t* sendreq,
send_request_pml_complete(sendreq);
/* check for pending requests */
MCA_PML_BFO_PROGRESS_PENDING(bml_btl->btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
return OMPI_SUCCESS;
}
} else {
@ -606,7 +618,7 @@ int mca_pml_bfo_send_request_start_copy( mca_pml_bfo_send_request_t* sendreq,
rc = mca_bml_base_send_status(bml_btl, des, MCA_PML_BFO_HDR_TYPE_MATCH);
if( OPAL_LIKELY( rc >= OMPI_SUCCESS ) ) {
if( OPAL_LIKELY( 1 == rc ) ) {
mca_pml_bfo_match_completion_free_request( bml_btl->btl, sendreq );
mca_pml_bfo_match_completion_free_request( bml_btl, sendreq );
}
return OMPI_SUCCESS;
}
@ -670,7 +682,7 @@ int mca_pml_bfo_send_request_start_prepare( mca_pml_bfo_send_request_t* sendreq,
rc = mca_bml_base_send(bml_btl, des, MCA_PML_BFO_HDR_TYPE_MATCH);
if( OPAL_LIKELY( rc >= 0 ) ) {
if( OPAL_LIKELY( 1 == rc ) ) {
mca_pml_bfo_match_completion_free_request( bml_btl->btl, sendreq );
mca_pml_bfo_match_completion_free_request( bml_btl, sendreq );
}
return OMPI_SUCCESS;
}
@ -838,7 +850,7 @@ int mca_pml_bfo_send_request_start_rdma( mca_pml_bfo_send_request_t* sendreq,
rc = mca_bml_base_send(bml_btl, des, hdr->hdr_common.hdr_type);
if( OPAL_LIKELY( rc >= 0 ) ) {
if( OPAL_LIKELY( 1 == rc ) && (true == need_local_cb)) {
mca_pml_bfo_rndv_completion_request( bml_btl->btl, sendreq, 0 );
mca_pml_bfo_rndv_completion_request( bml_btl, sendreq, 0 );
}
/* BFO FAILOVER CODE - begin */
if ((des->des_flags & MCA_BTL_DES_SEND_ALWAYS_CALLBACK) &&
@ -931,7 +943,7 @@ int mca_pml_bfo_send_request_start_rndv( mca_pml_bfo_send_request_t* sendreq,
rc = mca_bml_base_send(bml_btl, des, MCA_PML_BFO_HDR_TYPE_RNDV);
if( OPAL_LIKELY( rc >= 0 ) ) {
if( OPAL_LIKELY( 1 == rc ) ) {
mca_pml_bfo_rndv_completion_request( bml_btl->btl, sendreq, size );
mca_pml_bfo_rndv_completion_request( bml_btl, sendreq, size );
}
/* BFO FAILOVER CODE - begin */
if (des->des_flags & MCA_BTL_DES_SEND_ALWAYS_CALLBACK) {
@ -1196,7 +1208,7 @@ static void mca_pml_bfo_put_completion( mca_btl_base_module_t* btl,
{
mca_pml_bfo_rdma_frag_t* frag = (mca_pml_bfo_rdma_frag_t*)des->des_cbdata;
mca_pml_bfo_send_request_t* sendreq = (mca_pml_bfo_send_request_t*)frag->rdma_req;
mca_bml_base_btl_t* bml_btl;
mca_bml_base_btl_t* bml_btl = (mca_bml_base_btl_t*) des->des_context;
/* BFO FAILOVER CODE - begin */
sendreq->req_events--;
/* BFO FAILOVER CODE - end */
@ -1210,23 +1222,7 @@ static void mca_pml_bfo_put_completion( mca_btl_base_module_t* btl,
/* BFO FAILOVER CODE - begin */
MCA_PML_BFO_CHECK_SENDREQ_ERROR_ON_PUT_COMPLETION(sendreq, status, btl);
/* BFO FAILOVER CODE - end */
/* BFO FAILOVER CODE - begin */
/* Find back the bml_btl that this btl belongs to. If we cannot
* find it, then it may have been removed from underneath us, so
* find the next available one to send the FIN message on. */
bml_btl = mca_bml_base_btl_array_find(&sendreq->req_endpoint->btl_rdma, btl);
if( OPAL_UNLIKELY(NULL == bml_btl) ) {
opal_output_verbose(20, mca_pml_bfo_output,
"RDMA write completion: BML was removed from underneath us, "
"PML=%d, RQS=%d, src_req=%p, dst_req=%p, status=%d, peer=%d",
(uint16_t)sendreq->req_send.req_base.req_sequence,
sendreq->req_restartseq, (void *)sendreq,
sendreq->req_recv.pval,
status, sendreq->req_send.req_base.req_peer);
bml_btl = mca_bml_base_btl_array_get_next(&sendreq->req_endpoint->btl_rdma);
}
MCA_PML_BFO_CHECK_SENDREQ_EAGER_BML_BTL(bml_btl, btl, sendreq, "RDMA write");
/* BFO FAILOVER CODE - end */
mca_pml_bfo_send_fin(sendreq->req_send.req_base.req_proc,
@ -1243,7 +1239,7 @@ static void mca_pml_bfo_put_completion( mca_btl_base_module_t* btl,
MCA_PML_BFO_RDMA_FRAG_RETURN(frag);
MCA_PML_BFO_PROGRESS_PENDING(btl);
MCA_PML_BFO_PROGRESS_PENDING(bml_btl);
}
int mca_pml_bfo_send_request_put_frag( mca_pml_bfo_rdma_frag_t* frag )

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

@ -479,7 +479,7 @@ int mca_pml_bfo_send_request_put_frag(mca_pml_bfo_rdma_frag_t* frag);
* available. bml_btl passed to the function doesn't represents sendreq
* destination, it represents BTL on which resource was freed, so only this BTL
* should be considered for sending packets */
void mca_pml_bfo_send_request_process_pending(mca_btl_base_module_t *btl);
void mca_pml_bfo_send_request_process_pending(mca_bml_base_btl_t *bml_btl);
void mca_pml_bfo_send_request_copy_in_out(mca_pml_bfo_send_request_t *sendreq,
uint64_t send_offset, uint64_t send_length);