Fix breakage of GM by r13921. On receive GM provides only buffer pointer
without any context so we need to save a context somewhere so it can be retrieved given only buffer pointer. This patch saves context (pointer to frag) just before start of a buffer so it can be be easily retrieved. This commit was SVN r14664. The following SVN revision numbers were found above: r13921 --> open-mpi/ompi@90fb58de4f
Этот коммит содержится в:
родитель
ce4e24c399
Коммит
61e889a1d9
@ -283,7 +283,7 @@ mca_btl_gm_module_init (mca_btl_gm_module_t * btl)
|
||||
|
||||
/* initialize free lists */
|
||||
ompi_free_list_init( &btl->gm_frag_eager,
|
||||
sizeof (mca_btl_gm_frag_eager_t) + (1 << mca_btl_gm_component.gm_eager_frag_size),
|
||||
sizeof (mca_btl_gm_frag_eager_t) + (1 << mca_btl_gm_component.gm_eager_frag_size) + sizeof (uintptr_t),
|
||||
OBJ_CLASS (mca_btl_gm_frag_eager_t),
|
||||
btl->gm_max_send_tokens,
|
||||
mca_btl_gm_component.gm_free_list_max,
|
||||
@ -291,7 +291,7 @@ mca_btl_gm_module_init (mca_btl_gm_module_t * btl)
|
||||
btl->super.btl_mpool );
|
||||
|
||||
ompi_free_list_init( &btl->gm_frag_max,
|
||||
sizeof (mca_btl_gm_frag_max_t) + (1 << mca_btl_gm_component.gm_max_frag_size),
|
||||
sizeof (mca_btl_gm_frag_max_t) + (1 << mca_btl_gm_component.gm_max_frag_size) + sizeof (uintptr_t),
|
||||
OBJ_CLASS (mca_btl_gm_frag_max_t),
|
||||
btl->gm_max_recv_tokens,
|
||||
mca_btl_gm_component.gm_free_list_max,
|
||||
@ -581,7 +581,7 @@ int mca_btl_gm_component_progress()
|
||||
case GM_FAST_HIGH_PEER_RECV_EVENT:
|
||||
{
|
||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)(buffer - sizeof(mca_btl_gm_frag_t));
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)*((uintptr_t*)(buffer - sizeof(uintptr_t)));
|
||||
mca_btl_base_header_t* hdr = (mca_btl_base_header_t *)gm_ntohp(event->recv.message);
|
||||
mca_btl_base_recv_reg_t* reg;
|
||||
frag->segment.seg_addr.pval = (hdr+1);
|
||||
@ -608,7 +608,7 @@ int mca_btl_gm_component_progress()
|
||||
case GM_HIGH_PEER_RECV_EVENT:
|
||||
{
|
||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)(buffer - sizeof(mca_btl_gm_frag_t));
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)*((uintptr_t*)(buffer - sizeof(uintptr_t)));
|
||||
mca_btl_base_header_t* hdr = (mca_btl_base_header_t*)buffer;
|
||||
mca_btl_base_recv_reg_t* reg;
|
||||
frag->segment.seg_addr.pval = (hdr+1);
|
||||
@ -674,7 +674,7 @@ static void* mca_btl_gm_progress_thread( opal_object_t* arg )
|
||||
case GM_FAST_HIGH_PEER_RECV_EVENT:
|
||||
{
|
||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)(buffer - sizeof(mca_btl_gm_frag_t));
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)*((uintptr_t*)(buffer - sizeof(uintptr_t)));
|
||||
mca_btl_base_header_t* hdr = (mca_btl_base_header_t *)gm_ntohp(event->recv.message);
|
||||
mca_btl_base_recv_reg_t* reg;
|
||||
frag->segment.seg_addr.pval = (hdr+1);
|
||||
@ -694,7 +694,7 @@ static void* mca_btl_gm_progress_thread( opal_object_t* arg )
|
||||
case GM_HIGH_PEER_RECV_EVENT:
|
||||
{
|
||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)(buffer - sizeof(mca_btl_gm_frag_t));
|
||||
mca_btl_gm_frag_t* frag = (mca_btl_gm_frag_t*)*((uintptr_t*)(buffer - sizeof(uintptr_t)));
|
||||
mca_btl_base_header_t* hdr = (mca_btl_base_header_t*)buffer;
|
||||
mca_btl_base_recv_reg_t* reg;
|
||||
frag->segment.seg_addr.pval = (hdr+1);
|
||||
|
@ -28,8 +28,10 @@ do { \
|
||||
} while(0)
|
||||
|
||||
static void mca_btl_gm_frag_eager_constructor(mca_btl_gm_frag_t* frag)
|
||||
{
|
||||
frag->hdr = (mca_btl_base_header_t*)frag->base.super.ptr;
|
||||
{
|
||||
uintptr_t *ctx = (uintptr_t*)frag->base.super.ptr;
|
||||
*ctx = (uintptr_t)frag;
|
||||
frag->hdr = (mca_btl_base_header_t*)(ctx + 1);
|
||||
frag->segment.seg_addr.pval = (unsigned char*)(frag->hdr + 1);
|
||||
frag->segment.seg_len = mca_btl_gm_module.super.btl_eager_limit - sizeof(mca_btl_base_header_t);
|
||||
frag->size = mca_btl_gm_component.gm_eager_frag_size;
|
||||
@ -37,8 +39,10 @@ static void mca_btl_gm_frag_eager_constructor(mca_btl_gm_frag_t* frag)
|
||||
}
|
||||
|
||||
static void mca_btl_gm_frag_max_constructor(mca_btl_gm_frag_t* frag)
|
||||
{
|
||||
frag->hdr = (mca_btl_base_header_t*)(frag + 1);
|
||||
{
|
||||
uintptr_t *ctx = (uintptr_t*)frag->base.super.ptr;
|
||||
*ctx = (uintptr_t)frag;
|
||||
frag->hdr = (mca_btl_base_header_t*)(ctx + 1);
|
||||
frag->segment.seg_addr.pval = (unsigned char*)(frag->hdr + 1);
|
||||
frag->segment.seg_len = mca_btl_gm_module.super.btl_max_send_size - sizeof(mca_btl_base_header_t);
|
||||
frag->size = mca_btl_gm_component.gm_max_frag_size;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user