Brian,
Sorry for slow reaction.
I am not sure I understand your concern. Could you please make it
clearer and review modified patch (I have figured out issue in my
previous patch as absence of complete btl initialization in case PML
components different from bfo and ob1 needed for OSHMEM.)
Igor
On 03.01.2014 00:04, Barrett, Brian W wrote:
Igor -
Sorry for the slow reply; I was on vacation for the last week and a half.
The patch doesn't look quite right to me. If the cm PML is used, the spml
(or something else in the OSHMEM layer) is going to have to call add_procs
on the BML to initialize the procs arrays for the BTLs.
Brian
On 12/23/13 3:49 AM, "Igor Ivanov" <igor.iva...@itseez.com> wrote:
Brian,
Could you look at patch based on your suggestion. It resolves the issue
with mca variable.
Igor
On 18.12.2013 01:48, Barrett, Brian W wrote:
The proposed solution at the bottom is wrong. There aren't two
different
BMLs, there's one, and it lives in OMPI.
The solution is to open the bml and btls in ompi_mpi_init and not in the
pmls. I checked, and the bml will deal with add_procs being called
multiple times on the same proc, so just moving the framework open /
init
is sufficient. This will also solve the MTL problem.
Brian
On 12/17/13 8:33 AM, "Joshua Ladd" <josh...@mellanox.com> wrote:
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
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel
--
Brian W. Barrett
Scalable System Software Group
Sandia National Laboratories
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel
--
Brian W. Barrett
Scalable System Software Group
Sandia National Laboratories
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel
>From 26323ffa43df197dd88e9dfe0dbc4c6c44a08a37 Mon Sep 17 00:00:00 2001
From: Igor Ivanov <igor.iva...@itseez.com>
List-Post: devel@lists.open-mpi.org
Date: Thu, 19 Dec 2013 17:24:56 +0400
Subject: [PATCH] bml initialization is moved into ompi_init
Change-Id: I3b9a8dd13b88445f55de46089375c910c7320470
---
ompi/runtime/ompi_mpi_finalize.c | 5 +++++
ompi/runtime/ompi_mpi_init.c | 13 +++++++++++++
oshmem/mca/spml/yoda/spml_yoda_component.c | 10 +++-------
3 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/ompi/runtime/ompi_mpi_finalize.c b/ompi/runtime/ompi_mpi_finalize.c
index 1685019..44ef6f1 100644
--- a/ompi/runtime/ompi_mpi_finalize.c
+++ b/ompi/runtime/ompi_mpi_finalize.c
@@ -60,7 +60,9 @@
#include "ompi/runtime/mpiruntime.h"
#include "ompi/attribute/attribute.h"
#include "ompi/mca/pml/pml.h"
+#include "ompi/mca/bml/bml.h"
#include "ompi/mca/pml/base/base.h"
+#include "ompi/mca/bml/base/base.h"
#include "ompi/mca/osc/base/base.h"
#include "ompi/mca/coll/base/base.h"
#include "ompi/mca/rte/rte.h"
@@ -393,6 +395,9 @@ int ompi_mpi_finalize(void)
if (OMPI_SUCCESS != (ret =
mca_base_framework_close(&ompi_coll_base_framework))) {
return ret;
}
+ if (OMPI_SUCCESS != (ret =
mca_base_framework_close(&ompi_bml_base_framework))) {
+ return ret;
+ }
if (OMPI_SUCCESS != (ret =
mca_base_framework_close(&ompi_mpool_base_framework))) {
return ret;
}
diff --git a/ompi/runtime/ompi_mpi_init.c b/ompi/runtime/ompi_mpi_init.c
index b908dea..1f8c2d8 100644
--- a/ompi/runtime/ompi_mpi_init.c
+++ b/ompi/runtime/ompi_mpi_init.c
@@ -72,7 +72,9 @@
#include "ompi/mca/rcache/rcache.h"
#include "ompi/mca/mpool/base/base.h"
#include "ompi/mca/pml/pml.h"
+#include "ompi/mca/bml/bml.h"
#include "ompi/mca/pml/base/base.h"
+#include "ompi/mca/bml/base/base.h"
#include "ompi/mca/osc/base/base.h"
#include "ompi/mca/coll/base/base.h"
#include "ompi/mca/io/io.h"
@@ -562,6 +564,10 @@ int ompi_mpi_init(int argc, char **argv, int requested,
int *provided)
error = "mca_mpool_base_open() failed";
goto error;
}
+ if (OMPI_SUCCESS != (ret =
mca_base_framework_open(&ompi_bml_base_framework, 0))) {
+ error = "mca_bml_base_open() failed";
+ goto error;
+ }
if (OMPI_SUCCESS != (ret =
mca_base_framework_open(&ompi_pml_base_framework, 0))) {
error = "mca_pml_base_open() failed";
goto error;
@@ -599,6 +605,13 @@ int ompi_mpi_init(int argc, char **argv, int requested,
int *provided)
}
if (OMPI_SUCCESS !=
+ (ret = mca_bml_base_init(OMPI_ENABLE_PROGRESS_THREADS,
+ OMPI_ENABLE_THREAD_MULTIPLE))) {
+ error = "mca_bml_base_init() failed";
+ goto error;
+ }
+
+ if (OMPI_SUCCESS !=
(ret = mca_pml_base_select(OMPI_ENABLE_PROGRESS_THREADS,
OMPI_ENABLE_THREAD_MULTIPLE))) {
error = "mca_pml_base_select() failed";
diff --git a/oshmem/mca/spml/yoda/spml_yoda_component.c
b/oshmem/mca/spml/yoda/spml_yoda_component.c
index 39ccafe..4829ce9 100644
--- a/oshmem/mca/spml/yoda/spml_yoda_component.c
+++ b/oshmem/mca/spml/yoda/spml_yoda_component.c
@@ -11,7 +11,6 @@
#include "oshmem_config.h"
#include "oshmem/runtime/params.h"
#include "oshmem/mca/spml/spml.h"
-#include "ompi/mca/bml/base/base.h"
#include "spml_yoda_component.h"
#include "oshmem/mca/spml/yoda/spml_yoda_rdmafrag.h"
#include "oshmem/mca/spml/yoda/spml_yoda_putreq.h"
@@ -86,16 +85,13 @@ static int mca_spml_yoda_component_register(void)
return OSHMEM_SUCCESS;
}
-static int mca_spml_yoda_component_open(void) {
- return mca_base_framework_open(&ompi_bml_base_framework,
MCA_BASE_OPEN_DEFAULT);
+static int mca_spml_yoda_component_open(void)
+{
+ return OSHMEM_SUCCESS;
}
static int mca_spml_yoda_component_close(void)
{
- int rc;
- if (OMPI_SUCCESS != (rc =
mca_base_framework_close(&ompi_bml_base_framework))) {
- return rc;
- }
return OSHMEM_SUCCESS;
}
--
1.7.11.3