From 61e889a1d92afe41d0083e54d66a496f5fcc15ec Mon Sep 17 00:00:00 2001 From: Gleb Natapov Date: Wed, 16 May 2007 12:20:58 +0000 Subject: [PATCH] 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@90fb58de4f59ce9c42e773464a153ff0634d13af --- ompi/mca/btl/gm/btl_gm_component.c | 12 ++++++------ ompi/mca/btl/gm/btl_gm_frag.c | 12 ++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/ompi/mca/btl/gm/btl_gm_component.c b/ompi/mca/btl/gm/btl_gm_component.c index 94100d1c7b..d3793389ed 100644 --- a/ompi/mca/btl/gm/btl_gm_component.c +++ b/ompi/mca/btl/gm/btl_gm_component.c @@ -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); diff --git a/ompi/mca/btl/gm/btl_gm_frag.c b/ompi/mca/btl/gm/btl_gm_frag.c index 25c67aed06..34608fe84b 100644 --- a/ompi/mca/btl/gm/btl_gm_frag.c +++ b/ompi/mca/btl/gm/btl_gm_frag.c @@ -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;