Fixed bug trac #213 by moving the udapl btl header to being a footer.
Also fixed bug trac #346. This commit was SVN r11760.
Этот коммит содержится в:
родитель
3c814fdd23
Коммит
d636db5832
@ -63,7 +63,7 @@ mca_btl_udapl_module_t mca_btl_udapl_module = {
|
||||
NULL, /* get */
|
||||
mca_btl_base_dump,
|
||||
NULL, /* mpool */
|
||||
NULL /* register error cb */
|
||||
NULL /* register error cb */
|
||||
}
|
||||
};
|
||||
|
||||
@ -347,9 +347,11 @@ mca_btl_base_descriptor_t* mca_btl_udapl_alloc(
|
||||
|
||||
/* Set up the LMR triplet from the frag segment */
|
||||
/* Note that this triplet defines a sub-region of a registered LMR */
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->hdr;
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->segment.seg_addr.pval;
|
||||
frag->ftr = (mca_btl_udapl_footer_t *)
|
||||
((char *)frag->segment.seg_addr.pval + frag->segment.seg_len);
|
||||
frag->triplet.segment_length =
|
||||
frag->segment.seg_len + sizeof(mca_btl_base_header_t);
|
||||
frag->segment.seg_len + sizeof(mca_btl_udapl_footer_t);
|
||||
assert(frag->triplet.lmr_context ==
|
||||
((mca_mpool_udapl_registration_t*)frag->registration)->lmr_triplet.lmr_context);
|
||||
|
||||
@ -486,7 +488,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
|
||||
frag->registration = registration;
|
||||
frag->triplet.lmr_context =
|
||||
((mca_mpool_udapl_registration_t*)registration)->lmr_triplet.lmr_context;
|
||||
/* TODO - should our base addr be frag->hdr? */
|
||||
/* TODO - should our base addr be frag->ftr? */
|
||||
frag->segment.seg_len = max_data;
|
||||
frag->segment.seg_addr.pval = iov.iov_base;
|
||||
frag->triplet.segment_length = max_data;
|
||||
@ -506,7 +508,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
|
||||
}
|
||||
|
||||
iov.iov_len = max_data;
|
||||
iov.iov_base = (unsigned char*) frag->segment.seg_addr.pval + reserve;
|
||||
iov.iov_base = (char *) frag->segment.seg_addr.pval + reserve;
|
||||
|
||||
rc = ompi_convertor_pack(convertor,
|
||||
&iov, &iov_count, &max_data, &free_after);
|
||||
@ -515,11 +517,6 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
|
||||
MCA_BTL_UDAPL_FRAG_RETURN_EAGER(btl, frag);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
frag->segment.seg_len = max_data + reserve;
|
||||
frag->triplet.segment_length =
|
||||
max_data + reserve + sizeof(mca_btl_base_header_t);
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->hdr;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -537,7 +534,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
|
||||
}
|
||||
|
||||
iov.iov_len = max_data;
|
||||
iov.iov_base = (unsigned char*) frag->segment.seg_addr.pval + reserve;
|
||||
iov.iov_base = (char *) frag->segment.seg_addr.pval + reserve;
|
||||
|
||||
rc = ompi_convertor_pack(convertor,
|
||||
&iov, &iov_count, &max_data, &free_after);
|
||||
@ -547,14 +544,17 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
|
||||
MCA_BTL_UDAPL_FRAG_RETURN_MAX(btl, frag);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* TODO - pull this out of the if statements. */
|
||||
frag->segment.seg_len = max_data + reserve;
|
||||
frag->triplet.segment_length =
|
||||
max_data + reserve + sizeof(mca_btl_base_header_t);
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->hdr;
|
||||
}
|
||||
|
||||
/* setup lengths and addresses to send out data */
|
||||
frag->segment.seg_len = max_data + reserve;
|
||||
frag->triplet.segment_length =
|
||||
max_data + reserve + sizeof(mca_btl_udapl_footer_t);
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->segment.seg_addr.pval;
|
||||
frag->ftr = (mca_btl_udapl_footer_t *)
|
||||
((char *)frag->segment.seg_addr.pval + frag->segment.seg_len);
|
||||
|
||||
/* initialize base descriptor */
|
||||
frag->base.des_src = &frag->segment;
|
||||
frag->base.des_src_cnt = 1;
|
||||
frag->base.des_dst = NULL;
|
||||
@ -656,7 +656,9 @@ int mca_btl_udapl_send(
|
||||
|
||||
frag->btl = (mca_btl_udapl_module_t*)btl;
|
||||
frag->endpoint = endpoint;
|
||||
frag->hdr->tag = tag;
|
||||
frag->ftr = (mca_btl_udapl_footer_t *)
|
||||
((char *)frag->segment.seg_addr.pval + frag->segment.seg_len);
|
||||
frag->ftr->tag = tag;
|
||||
frag->type = MCA_BTL_UDAPL_SEND;
|
||||
|
||||
/* TODO - will inlining this give worthwhile performance? */
|
||||
|
@ -54,7 +54,7 @@ mca_btl_udapl_component_t mca_btl_udapl_component = {
|
||||
/* Indicate that we are a pml v1.0.0 component (which also implies a
|
||||
specific MCA version) */
|
||||
|
||||
MCA_BTL_BASE_VERSION_1_0_1,
|
||||
MCA_BTL_BASE_VERSION_1_0_0,
|
||||
|
||||
"udapl", /* MCA component name */
|
||||
OMPI_MAJOR_VERSION, /* MCA component major version */
|
||||
@ -182,12 +182,12 @@ int mca_btl_udapl_component_open(void)
|
||||
mca_btl_udapl_component.udapl_eager_frag_size =
|
||||
mca_btl_udapl_module.super.btl_eager_limit;
|
||||
mca_btl_udapl_module.super.btl_eager_limit -=
|
||||
sizeof(mca_btl_base_header_t);
|
||||
sizeof(mca_btl_udapl_footer_t);
|
||||
|
||||
mca_btl_udapl_component.udapl_max_frag_size =
|
||||
mca_btl_udapl_module.super.btl_max_send_size;
|
||||
mca_btl_udapl_module.super.btl_max_send_size -=
|
||||
sizeof(mca_btl_base_header_t);
|
||||
sizeof(mca_btl_udapl_footer_t);
|
||||
|
||||
|
||||
/* leave pinned option */
|
||||
@ -412,6 +412,7 @@ static inline int mca_btl_udapl_sendrecv(mca_btl_udapl_module_t* btl,
|
||||
|
||||
memcpy(frag->segment.seg_addr.pval,
|
||||
&btl->udapl_addr, sizeof(mca_btl_udapl_addr_t));
|
||||
|
||||
frag->type = MCA_BTL_UDAPL_CONN_SEND;
|
||||
|
||||
rc = dat_ep_post_send(endpoint, 1,
|
||||
@ -498,7 +499,7 @@ int mca_btl_udapl_component_progress()
|
||||
|
||||
assert(frag->triplet.segment_length ==
|
||||
frag->segment.seg_len +
|
||||
sizeof(mca_btl_base_header_t));
|
||||
sizeof(mca_btl_udapl_footer_t));
|
||||
|
||||
cookie.as_ptr = frag;
|
||||
dat_ep_post_send(endpoint->endpoint_eager,
|
||||
@ -521,7 +522,7 @@ int mca_btl_udapl_component_progress()
|
||||
|
||||
assert(frag->triplet.segment_length ==
|
||||
frag->segment.seg_len +
|
||||
sizeof(mca_btl_base_header_t));
|
||||
sizeof(mca_btl_udapl_footer_t));
|
||||
|
||||
cookie.as_ptr = frag;
|
||||
dat_ep_post_send(endpoint->endpoint_max,
|
||||
@ -537,8 +538,7 @@ int mca_btl_udapl_component_progress()
|
||||
}
|
||||
case MCA_BTL_UDAPL_RECV:
|
||||
{
|
||||
mca_btl_base_recv_reg_t* reg =
|
||||
&btl->udapl_reg[frag->hdr->tag];
|
||||
mca_btl_base_recv_reg_t* reg;
|
||||
|
||||
assert(frag->base.des_dst == &frag->segment);
|
||||
assert(frag->base.des_dst_cnt == 1);
|
||||
@ -546,26 +546,26 @@ int mca_btl_udapl_component_progress()
|
||||
assert(frag->base.des_src_cnt == 0);
|
||||
assert(frag->type == MCA_BTL_UDAPL_RECV);
|
||||
assert(frag->triplet.virtual_address ==
|
||||
(DAT_VADDR)frag->hdr);
|
||||
(DAT_VADDR)frag->segment.seg_addr.pval);
|
||||
assert(frag->triplet.segment_length == frag->size);
|
||||
assert(frag->btl == btl);
|
||||
|
||||
/*OPAL_OUTPUT((0, "btl_udapl UDAPL_RECV %d",
|
||||
dto->transfered_length));*/
|
||||
|
||||
frag->segment.seg_addr.pval = frag->hdr + 1;
|
||||
/* setup frag ftr location and do callback */
|
||||
frag->segment.seg_len = dto->transfered_length -
|
||||
sizeof(mca_btl_base_header_t);
|
||||
|
||||
sizeof(mca_btl_udapl_footer_t);
|
||||
frag->ftr = (mca_btl_udapl_footer_t *)
|
||||
((char *)frag->segment.seg_addr.pval +
|
||||
frag->segment.seg_len);
|
||||
reg = &btl->udapl_reg[frag->ftr->tag];
|
||||
OPAL_THREAD_UNLOCK(&mca_btl_udapl_component.udapl_lock);
|
||||
reg->cbfunc(&btl->super,
|
||||
frag->hdr->tag, &frag->base, reg->cbdata);
|
||||
frag->ftr->tag, &frag->base, reg->cbdata);
|
||||
OPAL_THREAD_LOCK(&mca_btl_udapl_component.udapl_lock);
|
||||
|
||||
/* Repost the frag */
|
||||
frag->segment.seg_addr.pval = frag->hdr;
|
||||
frag->ftr = frag->segment.seg_addr.pval;
|
||||
frag->segment.seg_len =
|
||||
frag->size - sizeof(mca_btl_base_header_t);
|
||||
frag->size - sizeof(mca_btl_udapl_footer_t);
|
||||
frag->base.des_flags = 0;
|
||||
|
||||
if(frag->size ==
|
||||
|
@ -11,6 +11,8 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Sandia National Laboratories. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -55,7 +57,7 @@ int mca_btl_udapl_endpoint_send(mca_btl_base_endpoint_t* endpoint,
|
||||
|
||||
/* Fix up the segment length before we do anything with the frag */
|
||||
frag->triplet.segment_length =
|
||||
frag->segment.seg_len + sizeof(mca_btl_base_header_t);
|
||||
frag->segment.seg_len + sizeof(mca_btl_udapl_footer_t);
|
||||
|
||||
OPAL_THREAD_LOCK(&endpoint->endpoint_lock);
|
||||
switch(endpoint->endpoint_state) {
|
||||
@ -179,7 +181,7 @@ void mca_btl_udapl_endpoint_recv(int status, orte_process_name_t* endpoint,
|
||||
mca_btl_udapl_addr_t addr;
|
||||
mca_btl_udapl_proc_t* proc;
|
||||
mca_btl_base_endpoint_t* ep;
|
||||
size_t cnt = 1;
|
||||
int32_t cnt = 1;
|
||||
size_t i;
|
||||
int rc;
|
||||
|
||||
@ -286,6 +288,8 @@ failure_create:
|
||||
|
||||
/*
|
||||
* Finish establishing a connection
|
||||
* Note that this routine expects that the mca_btl_udapl_component.udapl.lock
|
||||
* has been acquired by the callee.
|
||||
*/
|
||||
|
||||
int mca_btl_udapl_endpoint_finish_connect(struct mca_btl_udapl_module_t* btl,
|
||||
@ -311,7 +315,6 @@ int mca_btl_udapl_endpoint_finish_connect(struct mca_btl_udapl_module_t* btl,
|
||||
/* TODO - Check that the DAT_CONN_QUAL's match too */
|
||||
if(ep->endpoint_btl == btl &&
|
||||
!memcmp(addr, &ep->endpoint_addr, sizeof(DAT_SOCK_ADDR))) {
|
||||
|
||||
OPAL_THREAD_LOCK(&ep->endpoint_lock);
|
||||
if(MCA_BTL_UDAPL_CONN_EAGER == ep->endpoint_state) {
|
||||
ep->endpoint_eager = endpoint;
|
||||
@ -324,7 +327,6 @@ int mca_btl_udapl_endpoint_finish_connect(struct mca_btl_udapl_module_t* btl,
|
||||
ep->endpoint_state));
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
@ -401,9 +403,10 @@ static int mca_btl_udapl_endpoint_finish_max(mca_btl_udapl_endpoint_t* endpoint)
|
||||
opal_list_remove_first(&endpoint->endpoint_eager_frags))) {
|
||||
cookie.as_ptr = frag;
|
||||
|
||||
assert(frag->triplet.virtual_address == (DAT_VADDR)frag->hdr);
|
||||
assert(frag->triplet.virtual_address ==
|
||||
(DAT_VADDR)frag->segment.seg_addr.pval);
|
||||
assert(frag->triplet.segment_length ==
|
||||
frag->segment.seg_len + sizeof(mca_btl_base_header_t));
|
||||
frag->segment.seg_len + sizeof(mca_btl_udapl_footer_t));
|
||||
assert(frag->size ==
|
||||
mca_btl_udapl_component.udapl_eager_frag_size);
|
||||
rc = dat_ep_post_send(endpoint->endpoint_eager, 1,
|
||||
@ -427,9 +430,9 @@ static int mca_btl_udapl_endpoint_finish_max(mca_btl_udapl_endpoint_t* endpoint)
|
||||
opal_list_remove_first(&endpoint->endpoint_max_frags))) {
|
||||
cookie.as_ptr = frag;
|
||||
|
||||
assert(frag->triplet.virtual_address == (DAT_VADDR)frag->hdr);
|
||||
assert(frag->triplet.virtual_address == (DAT_VADDR)frag->ftr);
|
||||
assert(frag->triplet.segment_length ==
|
||||
frag->segment.seg_len + sizeof(mca_btl_base_header_t));
|
||||
frag->segment.seg_len + sizeof(mca_btl_udapl_footer_t));
|
||||
assert(frag->size ==
|
||||
mca_btl_udapl_component.udapl_eager_frag_size);
|
||||
|
||||
@ -477,7 +480,7 @@ static int mca_btl_udapl_endpoint_post_recv(mca_btl_udapl_endpoint_t* endpoint,
|
||||
assert(size == frag->size);
|
||||
/* Set up the LMR triplet from the frag segment */
|
||||
/* Note that this triplet defines a sub-region of a registered LMR */
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->hdr;
|
||||
frag->triplet.virtual_address = (DAT_VADDR)frag->segment.seg_addr.pval;
|
||||
frag->triplet.segment_length = frag->size;
|
||||
|
||||
frag->btl = endpoint->endpoint_btl;
|
||||
|
@ -11,6 +11,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Sandia National Laboratories. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -36,8 +37,8 @@ static void mca_btl_udapl_frag_common_constructor(mca_btl_udapl_frag_t* frag)
|
||||
#endif
|
||||
|
||||
frag->registration = (mca_mpool_base_registration_t*)reg;
|
||||
frag->hdr = (mca_btl_base_header_t*)(frag + 1);
|
||||
frag->segment.seg_addr.pval = (unsigned char*)(frag->hdr + 1);
|
||||
frag->segment.seg_addr.pval = (unsigned char*)(frag + 1);
|
||||
frag->ftr = NULL;
|
||||
|
||||
/* Don't understand why yet, but there are cases where reg is NULL -
|
||||
that is, this memory has not been registered. So be careful not
|
||||
@ -67,14 +68,14 @@ static void mca_btl_udapl_frag_user_constructor(mca_btl_udapl_frag_t* frag)
|
||||
mca_btl_udapl_frag_common_constructor(frag);
|
||||
frag->segment.seg_len = 0;
|
||||
frag->segment.seg_addr.pval = NULL;
|
||||
frag->hdr = NULL;
|
||||
frag->ftr = NULL;
|
||||
frag->size = 0;
|
||||
}
|
||||
|
||||
static void mca_btl_udapl_frag_common_destructor(mca_btl_udapl_frag_t* frag)
|
||||
{
|
||||
#if OMPI_ENABLE_DEBUG
|
||||
frag->hdr = NULL;
|
||||
frag->ftr = NULL;
|
||||
frag->size = 0;
|
||||
frag->registration = NULL;
|
||||
frag->segment.seg_len = 0;
|
||||
|
@ -11,6 +11,8 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2006 Sandia National Laboratories. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -38,6 +40,14 @@ typedef enum {
|
||||
MCA_BTL_UDAPL_CONN_SEND
|
||||
} mca_btl_udapl_frag_type_t;
|
||||
|
||||
/**
|
||||
* uDAPL btl footer.
|
||||
* This is put after the payload packet so the PML header can be aligned.
|
||||
*/
|
||||
struct mca_btl_udapl_footer_t {
|
||||
mca_btl_base_tag_t tag;
|
||||
};
|
||||
typedef struct mca_btl_udapl_footer_t mca_btl_udapl_footer_t;
|
||||
|
||||
/**
|
||||
* uDAPL fragment derived type.
|
||||
@ -51,13 +61,14 @@ struct mca_btl_udapl_frag_t {
|
||||
struct mca_mpool_base_registration_t* registration;
|
||||
DAT_LMR_TRIPLET triplet;
|
||||
|
||||
mca_btl_base_header_t *hdr;
|
||||
mca_btl_udapl_footer_t *ftr;
|
||||
size_t size;
|
||||
mca_btl_udapl_frag_type_t type;
|
||||
};
|
||||
typedef struct mca_btl_udapl_frag_t mca_btl_udapl_frag_t;
|
||||
OBJ_CLASS_DECLARATION(mca_btl_udapl_frag_t);
|
||||
|
||||
|
||||
typedef struct mca_btl_udapl_frag_t mca_btl_udapl_frag_eager_t;
|
||||
OBJ_CLASS_DECLARATION(mca_btl_udapl_frag_eager_t);
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user