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 */
|
/* initialize free lists */
|
||||||
ompi_free_list_init( &btl->gm_frag_eager,
|
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),
|
OBJ_CLASS (mca_btl_gm_frag_eager_t),
|
||||||
btl->gm_max_send_tokens,
|
btl->gm_max_send_tokens,
|
||||||
mca_btl_gm_component.gm_free_list_max,
|
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 );
|
btl->super.btl_mpool );
|
||||||
|
|
||||||
ompi_free_list_init( &btl->gm_frag_max,
|
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),
|
OBJ_CLASS (mca_btl_gm_frag_max_t),
|
||||||
btl->gm_max_recv_tokens,
|
btl->gm_max_recv_tokens,
|
||||||
mca_btl_gm_component.gm_free_list_max,
|
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:
|
case GM_FAST_HIGH_PEER_RECV_EVENT:
|
||||||
{
|
{
|
||||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
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_header_t* hdr = (mca_btl_base_header_t *)gm_ntohp(event->recv.message);
|
||||||
mca_btl_base_recv_reg_t* reg;
|
mca_btl_base_recv_reg_t* reg;
|
||||||
frag->segment.seg_addr.pval = (hdr+1);
|
frag->segment.seg_addr.pval = (hdr+1);
|
||||||
@ -608,7 +608,7 @@ int mca_btl_gm_component_progress()
|
|||||||
case GM_HIGH_PEER_RECV_EVENT:
|
case GM_HIGH_PEER_RECV_EVENT:
|
||||||
{
|
{
|
||||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
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_header_t* hdr = (mca_btl_base_header_t*)buffer;
|
||||||
mca_btl_base_recv_reg_t* reg;
|
mca_btl_base_recv_reg_t* reg;
|
||||||
frag->segment.seg_addr.pval = (hdr+1);
|
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:
|
case GM_FAST_HIGH_PEER_RECV_EVENT:
|
||||||
{
|
{
|
||||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
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_header_t* hdr = (mca_btl_base_header_t *)gm_ntohp(event->recv.message);
|
||||||
mca_btl_base_recv_reg_t* reg;
|
mca_btl_base_recv_reg_t* reg;
|
||||||
frag->segment.seg_addr.pval = (hdr+1);
|
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:
|
case GM_HIGH_PEER_RECV_EVENT:
|
||||||
{
|
{
|
||||||
unsigned char* buffer = (unsigned char*)gm_ntohp(event->recv.buffer);
|
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_header_t* hdr = (mca_btl_base_header_t*)buffer;
|
||||||
mca_btl_base_recv_reg_t* reg;
|
mca_btl_base_recv_reg_t* reg;
|
||||||
frag->segment.seg_addr.pval = (hdr+1);
|
frag->segment.seg_addr.pval = (hdr+1);
|
||||||
|
@ -29,7 +29,9 @@ do { \
|
|||||||
|
|
||||||
static void mca_btl_gm_frag_eager_constructor(mca_btl_gm_frag_t* frag)
|
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_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->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;
|
frag->size = mca_btl_gm_component.gm_eager_frag_size;
|
||||||
@ -38,7 +40,9 @@ 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)
|
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_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->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;
|
frag->size = mca_btl_gm_component.gm_max_frag_size;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user