If you have an HCA with no active ports, we still create an mpool.
This mpool will have no btl module owner there was no btl created for the HCA with no ports, but it will still be tracked in the mpool framework (i.e., it's available). If MPI_ALLOC_MEM is called by the app, one of two things will happen: 1. if there's an HCA on the host with some active ports, the openib btl component will still be in the process space, and therefore the "mpool with no btl" (MWNB) module will still be able to call the reg/dereg functions, and all will be fine. However, if MPI_FREE_MEM is never invoked to free the memory, bad things will happen during MPI_FINALIZE. The pml is finalized, which finalizes all the btls. The btls finalize all their mpools and all is fine. But later we close down the mpool framework which then finalizes any left over mpool modules, such as MWNB. However, the openib BTL module functions that the MWNB was registered with are no longer in the process space, and it segv's while trying deregister the memory. 2. if there are *no* HCA's on the host with active ports, then the openib btl will have been unloaded, and when the MWNM tries to register the memory, the functions it tries to call (in the openib btl) are no longer there, and we segv. This commit was SVN r15735.
Этот коммит содержится в:
родитель
106beff744
Коммит
0fb8cf65a8
@ -666,7 +666,12 @@ static int init_one_hca(opal_list_t *btl_list, struct ibv_device* ib_dev)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return OMPI_SUCCESS;
|
||||
|
||||
/* If we made a BTL, we're done. Otherwise, fall through and
|
||||
destroy everything */
|
||||
if (hca->btls > 0) {
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
comp_channel:
|
||||
#if OMPI_ENABLE_PROGRESS_THREADS == 1
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user