For a fabric that requires routing with an engine with special properties, say avoiding credit loops via making use of SLs in routing, it might be preferable to not fall back to minhop if the configured routing engine fails.
E.g. the torus-2QoS routing engine uses both SL2VL maps and path SL values to provide routing free of credit loops, but cannot route fabrics for some patterns of failed switches. Should a switch fail that creates such a pattern, it may be preferable to keep the previous routing information loaded in the switches until a switch can be replaced that restores torus-2QoS's ability to route the fabric. The alternative, having some other engine route the fabric, will immediately introduce credit loops. Signed-off-by: Jim Schutt <jasc...@sandia.gov> --- opensm/include/opensm/osm_subnet.h | 1 + opensm/opensm/osm_opensm.c | 5 +++++ opensm/opensm/osm_ucast_mgr.c | 23 +++++++++++++++-------- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/opensm/include/opensm/osm_subnet.h b/opensm/include/opensm/osm_subnet.h index 6350dfb..3022143 100644 --- a/opensm/include/opensm/osm_subnet.h +++ b/opensm/include/opensm/osm_subnet.h @@ -214,6 +214,7 @@ typedef struct osm_subn_opt { osm_qos_options_t qos_rtr_options; boolean_t enable_quirks; boolean_t no_clients_rereg; + boolean_t no_fallback_routing_engine; #ifdef ENABLE_OSM_PERF_MGR boolean_t perfmgr; boolean_t perfmgr_redir; diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c index 7052d49..e7ef55c 100644 --- a/opensm/opensm/osm_opensm.c +++ b/opensm/opensm/osm_opensm.c @@ -159,6 +159,11 @@ static struct osm_routing_engine *setup_routing_engine(osm_opensm_t *osm, struct osm_routing_engine *re; const struct routing_engine_module *m; + if (!strcmp(name, "no_fallback")) { + osm->subn.opt.no_fallback_routing_engine = TRUE; + return NULL; + } + for (m = routing_modules; m->name && *m->name; m++) { if (!strcmp(m->name, name)) { re = malloc(sizeof(struct osm_routing_engine)); diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c index c29eb8f..f3cd379 100644 --- a/opensm/opensm/osm_ucast_mgr.c +++ b/opensm/opensm/osm_ucast_mgr.c @@ -976,7 +976,8 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr) p_routing_eng = p_routing_eng->next; } - if (!p_osm->routing_engine_used) { + if (!p_osm->routing_engine_used && + p_osm->subn.opt.no_fallback_routing_engine != TRUE) { /* If configured routing algorithm failed, use default MinHop */ struct osm_routing_engine *r = p_osm->default_routing_engine; @@ -986,14 +987,20 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * p_mgr) osm_ucast_mgr_set_fwd_tables(p_mgr); } - OSM_LOG(p_mgr->p_log, OSM_LOG_INFO, - "%s tables configured on all switches\n", - osm_routing_engine_type_str(p_osm-> - routing_engine_used->type)); - - if (p_mgr->p_subn->opt.use_ucast_cache) - p_mgr->cache_valid = TRUE; + if (p_osm->routing_engine_used) { + OSM_LOG(p_mgr->p_log, OSM_LOG_INFO, + "%s tables configured on all switches\n", + osm_routing_engine_type_str(p_osm-> + routing_engine_used->type)); + if (p_mgr->p_subn->opt.use_ucast_cache) + p_mgr->cache_valid = TRUE; + } else { + p_mgr->p_subn->subnet_initialization_error = TRUE; + OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR, + "No routing engine able to successfully configure " + " switch tables on current fabric\n"); + } Exit: CL_PLOCK_RELEASE(p_mgr->p_lock); OSM_LOG_EXIT(p_mgr->p_log); -- 1.5.6.GIT -- 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