1
1

fix Segfault in finalize which happens because we try to call completion callback function from yoda, but yoda already unloaded at that moment.

wait for outstanding request to complete before closing
Refs: 3763

This commit was SVN r29857.
Этот коммит содержится в:
Mike Dubman 2013-12-11 08:48:07 +00:00
родитель 8da74bec34
Коммит 3252ccac6d
4 изменённых файлов: 23 добавлений и 0 удалений

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

@ -283,6 +283,9 @@ int mca_spml_yoda_deregister(mca_spml_mkey_t *mkeys)
struct yoda_btl *ybtl;
mca_spml_yoda_context_t* yoda_context;
MCA_SPML_CALL(fence());
mca_spml_yoda_wait_gets();
if (!mkeys) {
return OSHMEM_SUCCESS;
}
@ -885,6 +888,15 @@ int mca_spml_yoda_fence(void)
return OSHMEM_SUCCESS;
}
int mca_spml_yoda_wait_gets(void)
{
while (0 < mca_spml_yoda.n_active_gets) {
opal_progress();
}
return OSHMEM_SUCCESS;
}
void* mca_spml_yoda_get_remote_context(void* spml_context)
{
return ((mca_spml_yoda_context_t*) spml_context)->btl_src_segment;
@ -1125,6 +1137,8 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
segment = des->des_src;
spml_yoda_prepare_for_get((void*)segment->seg_addr.pval, ncopied, (void*)p_src, oshmem_my_proc_id(), (void*)p_dst, (void*) getreq);
des->des_cbfunc = mca_spml_yoda_get_response_completion;
OPAL_THREAD_ADD32(&mca_spml_yoda.n_active_gets, 1);
}
else{
/*
@ -1160,6 +1174,8 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
frag->size = ncopied;
des->des_cbfunc = mca_spml_yoda_get_completion;
des->des_src = &frag->rdma_segs[0].base_seg;
OPAL_THREAD_ADD32(&mca_spml_yoda.n_active_gets, 1);
}
/**

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

@ -73,6 +73,7 @@ struct mca_spml_yoda_t {
ompi_free_list_t rdma_frags;
/* number of outstanding put requests */
int32_t n_active_puts;
int32_t n_active_gets;
bool enabled;
struct yoda_btl *btl_type_map;
int n_btls;
@ -120,6 +121,7 @@ extern void* mca_spml_yoda_get_remote_context(void*);
extern void mca_spml_yoda_set_remote_context(void**, void*);
extern int mca_spml_yoda_get_remote_context_size(void*);
extern void mca_spml_yoda_set_remote_context_size(void**, int);
extern int mca_spml_yoda_wait_gets(void);
#if OSHMEM_WAIT_COMPLETION_DEBUG == 1
extern void condition_dbg_init(void);

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

@ -118,6 +118,7 @@ mca_spml_yoda_component_init(int* priority,
}
mca_spml_yoda.n_active_puts = 0;
mca_spml_yoda.n_active_gets = 0;
return &mca_spml_yoda.super;
}

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

@ -102,6 +102,8 @@ void mca_spml_yoda_get_completion(mca_btl_base_module_t* btl,
oshmem_request_free((oshmem_request_t**) &getreq);
mca_bml_base_free(bml_btl, des);
OPAL_THREAD_ADD32(&mca_spml_yoda.n_active_gets, -1);
}
void mca_spml_yoda_get_response_completion(mca_btl_base_module_t* btl,
@ -119,4 +121,6 @@ void mca_spml_yoda_get_response_completion(mca_btl_base_module_t* btl,
}
mca_bml_base_free(bml_btl, des);
OPAL_THREAD_ADD32(&mca_spml_yoda.n_active_gets, -1);
}