Hi Sasha:

On Wed, 2010-07-07 at 11:06 -0600, Sasha Khapyorsky wrote:
> Hi Jim,
> 
> On 13:53 Tue 15 Jun     , Jim Schutt wrote:
> > diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c
> > index d3dc02e..5614240 100644
> > --- a/opensm/opensm/osm_opensm.c
> > +++ b/opensm/opensm/osm_opensm.c
> > @@ -147,7 +147,8 @@ static void append_routing_engine(osm_opensm_t *osm,
> >     r->next = routing_engine;
> >  }
> >  
> > -static void setup_routing_engine(osm_opensm_t *osm, const char *name)
> > +static struct osm_routing_engine *setup_routing_engine(osm_opensm_t *osm,
> > +                                                  const char *name)
> >  {
> >     struct osm_routing_engine *re;
> >     const struct routing_engine_module *m;
> > @@ -158,47 +159,53 @@ static void setup_routing_engine(osm_opensm_t *osm, 
> > const char *name)
> >                     if (!re) {
> >                             OSM_LOG(&osm->log, OSM_LOG_VERBOSE,
> >                                     "memory allocation failed\n");
> > -                           return;
> > +                           return NULL;
> >                     }
> >                     memset(re, 0, sizeof(struct osm_routing_engine));
> >  
> >                     re->name = m->name;
> > +                   re->type = osm_routing_engine_type(m->name);
> >                     if (m->setup(re, osm)) {
> >                             OSM_LOG(&osm->log, OSM_LOG_VERBOSE,
> >                                     "setup of routing"
> >                                     " engine \'%s\' failed\n", name);
> > -                           return;
> > +                           free(re);
> > +                           return NULL;
> >                     }
> >                     OSM_LOG(&osm->log, OSM_LOG_DEBUG,
> >                             "\'%s\' routing engine set up\n", re->name);
> > -                   append_routing_engine(osm, re);
> > -                   return;
> > +                   if (re->type == OSM_ROUTING_ENGINE_TYPE_MINHOP)
> > +                           osm->default_routing_engine = re;
> > +                   return re;
> >             }
> >     }
> >  
> >     OSM_LOG(&osm->log, OSM_LOG_ERROR,
> >             "cannot find or setup routing engine \'%s\'\n", name);
> > +   return NULL;
> >  }
> >  
> >  static void setup_routing_engines(osm_opensm_t *osm, const char 
> > *engine_names)
> >  {
> >     char *name, *str, *p;
> > +   struct osm_routing_engine *re;
> >  
> > -   if (!engine_names || !*engine_names) {
> > -           setup_routing_engine(osm, "minhop");
> > -           return;
> > +   if (engine_names && *engine_names) {
> > +           str = strdup(engine_names);
> > +           name = strtok_r(str, ", \t\n", &p);
> > +           while (name && *name) {
> > +                   re = setup_routing_engine(osm, name);
> > +                   if (re)
> > +                           append_routing_engine(osm, re);
> > +                   name = strtok_r(NULL, ", \t\n", &p);
> > +           }
> > +           free(str);
> >     }
> > -
> > -   str = strdup(engine_names);
> > -   name = strtok_r(str, ", \t\n", &p);
> > -   while (name && *name) {
> > -           setup_routing_engine(osm, name);
> > -           name = strtok_r(NULL, ", \t\n", &p);
> > +   if (!osm->default_routing_engine) {
> > +           re = setup_routing_engine(osm, "minhop");
> > +           if (!osm->routing_engine_list && re)
> > +                   append_routing_engine(osm, re);
> 
> Shouldn't here be:
> 
>               osm->default_routing_engine = re;
> 
> too?

I think above call to setup_routing_engine(osm, "minhop")
does that, because we're explicitly calling it for minhop?

But now that I look at this again, I'm confused why I
thought I needed to append a minhop routing engine to
the routing engine list when the list was empty and there 
was no default routing engine.

I was trying to exactly duplicate old functionality, where
minhop is only in the routing engine list if explicitly
configured, but always called if no routing engines are
configured or all configured engines fail.
   
So I think the end of the above chunk only needs to be

-
-       str = strdup(engine_names);
-       name = strtok_r(str, ", \t\n", &p);
-       while (name && *name) {
-               setup_routing_engine(osm, name);
-               name = strtok_r(NULL, ", \t\n", &p);
-       }
+       if (!osm->default_routing_engine)
+               setup_routing_engine(osm, "minhop");

-- Jim

> 
> 
> >     }
> > -   free(str);
> > -
> > -   if (!osm->routing_engine_list)
> > -           setup_routing_engine(osm, "minhop");
> >  }
> >  
> >  void osm_opensm_construct(IN osm_opensm_t * p_osm)
> 
> 
> So that this chunk in osm_ucast_mgr_process() (below) will not break
> over NULL pointer?
> 
> > -   if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) {
> > +   if (!p_osm->routing_engine_used) {
> >             /* If configured routing algorithm failed, use default MinHop */
> > -           osm_ucast_mgr_build_lid_matrices(p_mgr);
> > -           ucast_mgr_build_lfts(p_mgr);
> > +           struct osm_routing_engine *r = p_osm->default_routing_engine;
> > +
> > +           r->build_lid_matrices(r->context);
> > +           r->ucast_build_fwd_tables(r->context);
> > +           p_osm->routing_engine_used = r;
> >             osm_ucast_mgr_set_fwd_tables(p_mgr);
> > -           p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP;
> >     }
> 
> Sasha
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to