I believe Devendar Bureddy nailed the root cause. I am providing his excellent 
analysis below:

>From Devendar:

with curiosity i looked at this issue. here's my 2 cents
I think issue is because of BTL components is opened&closed twice(ompi_init, 
yoda) which leading to incorrect usage of var groups. The following sequence of 
events creating invalid memory

1) all openib component parameters registered in ompi_mpi_init
main > start_pes> shmem_init -> oshmem_shmem_init -> ompi_mpi_init -> 
mca_base_framework_open -> mca_pml_base_open ..... mca_bml_base_open... -> 
btl_openib_component_register()

*       for all string variables it allocated a memory block (var->mbv_storage 
= PTR)

At this time a new var group id:114 (of parent group id: 112) is created for 
all openib component variables.

2) This var group is de-registered in ompi_mpi_init. It marks all variables as 
invalid. but, the group&vars is still exist
main > start_pes> shmem_init -> oshmem_shmem_init -> mca_pml_base_select -> 
mca_base_components_close -> ... -> mca_bml_base_close -> 
mca_base_framework_close -> mca_base_var_group_deregister(groupid: 114) * all 
string variables memory is deallocated ( set var->mbv_storage = NULL;)

3) because of step 2). btl_openib.so shared lib dlclosed

4) Now we are reopening openib in yoda and registering the openib variables 
again.
main > start_pes> shmem_init > oshmem_shmem_init -> _shmem_init -> 
mca_base_framework_open -> mca_spml_base_open> mca_spml_yoda_component_open-> 
..... mca_bml_base_open... -> btl_openib_component_register -> 
register_variables()

*       In register_variables(), var_find() finds this variable( from the same 
old group: 114) and reset the variables.
*       For string variables, it allocated the buffers again ( 
(var->mbv_storage = PTR)
*       note that group:114 is not belongs to yoda component.

5) In yoda component close, it never finds above group(114) because this is not 
belongs to this component. So, do not call mca_base_var_group_deregister() 
again on the var group. string var memory is not deallocated.
main > start_pes> shmem_init > oshmem_shmem_init -> _shmem_init -> 
mca_spml_base_select ->..> mca_spml_yoda_component_close -> mca_bml_base_close 
-> mca_base_var_group_find().

6) because of step 5), the btl_openib.so is dlclosed(). This step invalidates, 
all openib string vars memory ( var->mbv_storage = PTR) allocated in step 4)

7) in ompi_mpi_finalize(), it will loop through all vars and finalizes and 
deallocate the string var memory (var->mbv_storage = PTR)
ompi_mpi_finalize >...> mca_base_var_finalize * var->mbv_storage = PTR is 
invalid at this stage and causing the SEGFAULT. 


This also explains why Dinar's patch, kostul_fix.patch 
(http://bgate.mellanox.com/redmine/attachments/1643/kostul_fix.patch), resolves 
the issue. His patch prevents you from finding the invalid already opened 
params.
So, I see in a lot of these registration functions the signature has an entry 
for the project name, but now, NULL, is always passed. I see a note by Nathan in

../opal/mca/base/mca_base_var.c +1311
{
/* XXX -- component_update -- We will stash the project name in the component */
return mca_base_var_register (NULL, component->mca_type_name,


Seems knowing the project name, oshmem, would allow us to distinguish between 
the different BMLs.

Nathan, please advise.

Josh


-----Original Message-----
From: devel [mailto:devel-boun...@open-mpi.org] On Behalf Of Nathan Hjelm
Sent: Monday, December 16, 2013 12:44 PM
To: Open MPI Developers
Subject: Re: [OMPI devel] bug in mca framework?

On Mon, Dec 16, 2013 at 05:21:05PM +0000, Joshua Ladd wrote:
> After speaking with Igor Ivanov about this this morning, he summarized his 
> findings as follows:
> 
> 1. Valgrind comes up clean.

Thats good to hear but unfortunate since this seems really like a 
stomping-on-memory problem.

> 2. The issue is not reproduced with a static build.

This is a red-herring. The variable itself contains garbage. The mbv_storage 
pointer looked like it was on the stack, the name was not valid, etc. Not sure 
how we got an mca_base_var_t into that state since the only time we touch 
anything in them is in mca_base_var_finalize. That functions cleans up all of 
the state to two calls to it should be harmless.

> 3. A bisection study reveals that problems first appear after commit: 
> https://svn.open-mpi.org/trac/ompi/changeset/28800/trunk/opal/mca/base
> /mca_base_var.c

Possibly also a coincidence. That commit only 1) moves the group stuff into its 
own file, and 2) adds the mca_base_pvar interface. Its possible I messed 
something up in the rest of the code but unlikely. I will take another look 
though.

-Nathan

> 
> 
> Josh
> 
> -----Original Message-----
> From: devel [mailto:devel-boun...@open-mpi.org] On Behalf Of Jeff 
> Squyres (jsquyres)
> Sent: Monday, December 16, 2013 12:15 PM
> To: Open MPI Developers
> Subject: Re: [OMPI devel] bug in mca framework?
> 
> It might be worthwhile to run this through valgrind and see if something is 
> being freed incorrectly...?
> 
> 
> On Dec 16, 2013, at 12:11 PM, Nathan Hjelm <hje...@lanl.gov> wrote:
> 
> > I took a look at the stacktraces last week and could not identify 
> > where the bug is. I will dig deeper this week and see if I can come up with 
> > the correct fix.
> > 
> > -Nathan
> > 
> > On Mon, Dec 09, 2013 at 03:17:36PM +0200, Mike Dubman wrote:
> >>   Nathan,
> >>   Could you please comment on the Igor`s observations?
> >>   Thanks
> >> 
> >>   On Wed, Dec 4, 2013 at 4:44 PM, Igor Ivanov <igor.iva...@itseez.com>
> >>   wrote:
> >> 
> >>     On 04.12.2013 17:56, Jeff Squyres (jsquyres) wrote:
> >> 
> >>       On Dec 4, 2013, at 2:52 AM, Igor Ivanov <igor.iva...@itseez.com>
> >>       wrote:
> >> 
> >>         It is the first mca variable with type as string from btl/openib as
> >>         'device_param_files'. Actually you can disable it and get failure 
> >> on
> >>         the second.
> >> 
> >>         Description of case we see:
> >>         1. openib mca variables are registered during startup as stage at
> >>         select component phase;
> >>         2. but a winner is cm component and openib mca variables are
> >>         deregistered as part of mca group;
> >>         3. mca variables are not removed from global mca array but they
> >>         marked as invalid and memory for string is freed;
> >>         4. shmem needs openib for yoda and does bml initialization;
> >>         5. openib mca variables are registered againusing light mode as
> >>         searching itself in global array and refreshing their 
> >> fields again;
> >> 
> >>       Can you explain what you mean by step 5?  I.e., what does "using 
> >> light
> >>       mode" mean?  Is the openib component register function invoked again?
> >> 
> >>     It is correct, it is called twice. "light mode" means that
> >>     mca_base_var_register() does not allocate mca variable object again, it
> >>     seeks this variable in global array and finding it updates fields in
> >>     mca_base_var_t structure (at least mbv_storage).
> >> 
> >>         6. for unknown reason bml finalization does not clean these vars as
> >>         it is done in step 2;
> >>         7. mca_btl_openib.so is unloaded;
> >>         8. opal_finalize() destroys mca variables form global array,
> >>         observes openib`s variable, try destroy using non accessed 
> >> address;
> >> 
> >>         So a code that is under discussion fixes step 6.
> >> 
> >>       Nathan: it sounds like an MCA var (and entire group) is registered,
> >>       unregistered, and then registered again. Does the MCA var system get
> >>       confused here when it tries to unregister the group a 2nd time?
> >> 
> >>     Probably issue relates incorrect recognition if variable valid/invalid
> >>     during second call of mca_base_var_deregister().
> >> 
> >>     _______________________________________________
> >>     devel mailing list
> >>     de...@open-mpi.org
> >>     http://www.open-mpi.org/mailman/listinfo.cgi/devel
> > 
> >> _______________________________________________
> >> devel mailing list
> >> de...@open-mpi.org
> >> http://www.open-mpi.org/mailman/listinfo.cgi/devel
> > 
> > _______________________________________________
> > devel mailing list
> > de...@open-mpi.org
> > http://www.open-mpi.org/mailman/listinfo.cgi/devel
> 
> 
> --
> Jeff Squyres
> jsquy...@cisco.com
> For corporate legal information go to: 
> http://www.cisco.com/web/about/doing_business/legal/cri/
> 
> _______________________________________________
> devel mailing list
> de...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/devel
> _______________________________________________
> devel mailing list
> de...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/devel

Reply via email to