1
1

Fixed bug trac #213 by moving the udapl btl header to being a footer.

Also fixed bug trac #346.

This commit was SVN r11760.
Этот коммит содержится в:
Terry Dontje 2006-09-22 19:28:09 +00:00
родитель 3c814fdd23
Коммит d636db5832
5 изменённых файлов: 66 добавлений и 49 удалений

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

@ -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);