[ofa-general] Re: [PATCH 2/2] opensm: setup routing engine when in use and delete when fail
Sasha Khapyorsky
sashak at voltaire.com
Thu Mar 12 06:21:44 PDT 2009
On 17:36 Thu 26 Feb , Eli Dorfman (Voltaire) wrote:
> setup routing engine when in use and delete when fail
> setup routing engine before use.
> delete resources when routing algorithm fails
> this will save allocation for routing algorithms that are not used.
>
> Signed-off-by: Eli Dorfman <elid at voltaire.com>
> ---
> opensm/opensm/osm_opensm.c | 20 ++++++--------------
> opensm/opensm/osm_ucast_mgr.c | 34 +++++++++++++++++++++++++++++++++-
> 2 files changed, 39 insertions(+), 15 deletions(-)
>
> diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c
> index 7de2e5b..a2620d5 100644
> --- a/opensm/opensm/osm_opensm.c
> +++ b/opensm/opensm/osm_opensm.c
> @@ -169,21 +169,14 @@ static void setup_routing_engine(osm_opensm_t *osm, const char *name)
> memset(re, 0, sizeof(struct osm_routing_engine));
>
> re->name = m->name;
> - if (m->setup(re, osm)) {
> - OSM_LOG(&osm->log, OSM_LOG_VERBOSE,
> - "setup of routing"
> - " engine \'%s\' failed\n", name);
> - return;
> - }
> - OSM_LOG(&osm->log, OSM_LOG_DEBUG,
> - "\'%s\' routing engine set up\n", re->name);
> + re->setup = m->setup;
> append_routing_engine(osm, re);
> return;
> }
> }
>
> OSM_LOG(&osm->log, OSM_LOG_ERROR,
> - "cannot find or setup routing engine \'%s\'", name);
> + "cannot find or setup routing engine \'%s\'\n", name);
This is needed fix, but unrelated to the patch.
> }
>
> static void setup_routing_engines(osm_opensm_t *osm, const char *engine_names)
> @@ -224,18 +217,17 @@ void osm_opensm_construct(IN osm_opensm_t * const p_osm)
>
> /**********************************************************************
> **********************************************************************/
> -static void destroy_routing_engines(osm_opensm_t *osm)
> +static void destroy_routing_engines(struct osm_routing_engine **re)
Any reason for function prototype change?
> {
> struct osm_routing_engine *r, *next;
>
> - next = osm->routing_engine_list;
> + next = *re;
> while (next) {
> r = next;
> next = r->next;
> - if (r->delete)
> - r->delete(r->context);
What will happen with currently used routing engine? It will be never
deleted, leak? right?
> free(r);
> }
> + *re = NULL;
> }
>
> /**********************************************************************
> @@ -289,7 +281,7 @@ void osm_opensm_destroy(IN osm_opensm_t * const p_osm)
>
> /* do the destruction in reverse order as init */
> destroy_plugins(p_osm);
> - destroy_routing_engines(p_osm);
> + destroy_routing_engines(&p_osm->routing_engine_list);
> osm_sa_destroy(&p_osm->sa);
> osm_sm_destroy(&p_osm->sm);
> #ifdef ENABLE_OSM_PERF_MGR
> diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
> index e404c91..7175926 100644
> --- a/opensm/opensm/osm_ucast_mgr.c
> +++ b/opensm/opensm/osm_ucast_mgr.c
> @@ -886,7 +886,6 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
>
> p_sw_guid_tbl = &p_mgr->p_subn->sw_guid_tbl;
> p_osm = p_mgr->p_subn->p_osm;
> - p_routing_eng = p_osm->routing_engine_list;
>
> CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock);
>
> @@ -897,10 +896,30 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
> ucast_mgr_setup_all_switches(p_mgr->p_subn) < 0)
> goto Exit;
>
> + /* update the entry in active list */
> +
> p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE;
> + p_routing_eng = p_osm->routing_engine_list;
> while (p_routing_eng) {
> + if (!p_routing_eng->initialized &&
> + p_routing_eng->setup(p_routing_eng, p_osm)) {
^^^^^^^^
> + OSM_LOG(p_mgr->p_log, OSM_LOG_VERBOSE,
> + "setup of routing engine \'%s\' failed\n",
> + p_routing_eng->name);
^^^^^^^^
Keep indentation please.
> + p_routing_eng = p_routing_eng->next;
> + continue;
> + }
> + OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG,
> + "\'%s\' routing engine set up\n", p_routing_eng->name);
> + p_routing_eng->initialized = 1;
> +
> if (!ucast_mgr_route(p_routing_eng, p_osm))
> break;
> +
> + /* delete unused routing engine */
> + if (p_routing_eng->delete)
> + p_routing_eng->delete(p_routing_eng->context);
> +
> p_routing_eng = p_routing_eng->next;
> }
>
> @@ -911,6 +930,19 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
> p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP;
> }
>
> + /* if for some reason different routing engine is used */
> + /* cleanup unused routing engine */
> + p_routing_eng = p_osm->routing_engine_list;
> + while (p_routing_eng) {
> + if (p_routing_eng->initialized &&
> + p_osm->routing_engine_used !=
> + osm_routing_engine_type(p_routing_eng->name) &&
> + p_routing_eng->delete)
> + p_routing_eng->delete(p_routing_eng->context);
> +
> + p_routing_eng = p_routing_eng->next;
> + }
> +
How this section of code is useful?
Sasha
More information about the general
mailing list