[ofa-general] Re: [OpenSM][16/18] - Routing Chaining
Sasha Khapyorsky
sashak at voltaire.com
Sun Sep 28 13:22:42 PDT 2008
Hi Al,
Some technical comments...
On 12:34 Mon 15 Sep , Al Chu wrote:
> stick a *next pointer into struct osm_routing_engine. Rearchitect
> routing engine usage as a list instead of a single struct.
>
> Al
>
> --
> Albert Chu
> chu11 at llnl.gov
> 925-422-5311
> Computer Scientist
> High Performance Systems Division
> Lawrence Livermore National Laboratory
> From 0cc04e2660a57a2b7b03e449563cc19bc5446811 Mon Sep 17 00:00:00 2001
> From: Albert Chu <chu11 at llnl.gov>
> Date: Fri, 12 Sep 2008 14:22:42 -0700
> Subject: [PATCH] rearchitect osm_routing_engine as a list data structure
>
>
> Signed-off-by: Albert Chu <chu11 at llnl.gov>
> ---
> opensm/include/opensm/osm_opensm.h | 10 +++-
> opensm/opensm/osm_opensm.c | 73 +++++++++++++++++++++++++++++++-----
> opensm/opensm/osm_ucast_mgr.c | 56 ++++++++++++++++++---------
> 3 files changed, 108 insertions(+), 31 deletions(-)
>
> diff --git a/opensm/include/opensm/osm_opensm.h b/opensm/include/opensm/osm_opensm.h
> index a1c255b..6990307 100644
> --- a/opensm/include/opensm/osm_opensm.h
> +++ b/opensm/include/opensm/osm_opensm.h
> @@ -126,6 +126,7 @@ struct osm_routing_engine {
> int (*ucast_build_fwd_tables) (void *context);
> void (*ucast_dump_tables) (void *context);
> void (*delete) (void *context);
> + struct osm_routing_engine *next;
> };
> /*
> * FIELDS
> @@ -148,6 +149,9 @@ struct osm_routing_engine {
> * delete
> * The delete method, may be used for routing engine
> * internals cleanup.
> +*
> +* next
> +* Pointer to next routing engine in the list.
> */
>
> /****s* OpenSM: OpenSM/osm_opensm_t
> @@ -178,7 +182,7 @@ typedef struct osm_opensm {
> osm_log_t log;
> cl_dispatcher_t disp;
> cl_plock_t lock;
> - struct osm_routing_engine routing_engine;
> + struct osm_routing_engine *routing_engine_list;
> osm_routing_engine_type_t routing_engine_used;
> osm_stats_t stats;
> osm_console_t console;
> @@ -221,8 +225,8 @@ typedef struct osm_opensm {
> * lock
> * Shared lock guarding most OpenSM structures.
> *
> -* routing_engine
> -* Routing engine; will be initialized then used.
> +* routing_engine_list
> +* List of routing engines that should be tried for use.
> *
> * routing_engine_used
> * Indicates which routing engine was used to route a subnet.
> diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c
> index 48e75f5..5b49d0a 100644
> --- a/opensm/opensm/osm_opensm.c
> +++ b/opensm/opensm/osm_opensm.c
> @@ -135,36 +135,72 @@ osm_routing_engine_type_t osm_routing_engine_type(IN const char *str)
>
> /**********************************************************************
> **********************************************************************/
> +static void append_routing_engine(osm_opensm_t * p_osm,
> + struct osm_routing_engine *routing_engine)
> +{
> + struct osm_routing_engine *p_routing_engine;
> +
> + routing_engine->next = NULL;
> +
> + if (!p_osm->routing_engine_list) {
> + p_osm->routing_engine_list = routing_engine;
> + return;
> + }
> +
> + p_routing_engine = p_osm->routing_engine_list;
> + while (p_routing_engine->next)
> + p_routing_engine = p_routing_engine->next;
> +
> + p_routing_engine->next = routing_engine;
> +}
> +
> static void setup_routing_engine(osm_opensm_t * p_osm, const char *name)
> {
> + struct osm_routing_engine *routing_engine = NULL;
> const struct routing_engine_module *r;
>
> + routing_engine = malloc(sizeof(struct osm_routing_engine));
> + if (!routing_engine) {
> + OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE,
> + "routing engine memory allocation failed\n");
> + return;
> + }
> + memset(routing_engine, '\0', sizeof(struct osm_routing_engine));
> +
> if (!name) {
> - osm_ucast_minhop_setup(&p_osm->routing_engine, p_osm);
> + osm_ucast_minhop_setup(routing_engine, p_osm);
> + append_routing_engine(p_osm, routing_engine);
> return;
> }
>
> for (r = routing_modules; r->name && *r->name; r++) {
> if (!strcmp(r->name, name)) {
> - p_osm->routing_engine.name = r->name;
> - if (r->setup(&p_osm->routing_engine, p_osm)) {
> + routing_engine->name = r->name;
> + if (r->setup(routing_engine, p_osm)) {
> OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE,
> "setup of routing"
> " engine \'%s\' failed\n", name);
> - break;
> + return;
> }
> OSM_LOG(&p_osm->log, OSM_LOG_DEBUG,
> "\'%s\' routing engine set up\n",
> - p_osm->routing_engine.name);
> + routing_engine->name);
> + append_routing_engine(p_osm, routing_engine);
> return;
> }
> }
>
> OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE,
> - "cannot find or setup routing engine"
> - " \'%s\'. Minhop will be used instead\n",
> + "cannot find or setup routing engine \'%s\'",
> name);
> - osm_ucast_minhop_setup(&p_osm->routing_engine, p_osm);
No free() for routing_engine in case of failure.
> +}
> +
> +static void setup_default_routing_engine(osm_opensm_t * p_osm)
> +{
> + setup_routing_engine(p_osm, NULL);
> +
> + OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE,
> + "Minhop configured as default routing\n");
> }
>
> /**********************************************************************
> @@ -184,6 +220,21 @@ void osm_opensm_construct(IN osm_opensm_t * const p_osm)
>
> /**********************************************************************
> **********************************************************************/
> +static void _osm_opensm_routing_engine_destroy(IN osm_opensm_t * const p_osm)
> +{
> + struct osm_routing_engine *p_routing_engine;
> +
> + if (!p_osm->routing_engine_list)
> + return;
> +
> + p_routing_engine = p_osm->routing_engine_list;
> + while (p_routing_engine) {
> + if (p_routing_engine->delete)
> + p_routing_engine->delete(p_routing_engine->context);
> + p_routing_engine = p_routing_engine->next;
No free() for p_routing_engine.
> + }
> +}
> +
> void osm_opensm_destroy(IN osm_opensm_t * const p_osm)
> {
> /* in case of shutdown through exit proc - no ^C */
> @@ -221,8 +272,7 @@ void osm_opensm_destroy(IN osm_opensm_t * const p_osm)
> osm_sa_db_file_dump(p_osm);
>
> /* do the destruction in reverse order as init */
> - if (p_osm->routing_engine.delete)
> - p_osm->routing_engine.delete(p_osm->routing_engine.context);
> + _osm_opensm_routing_engine_destroy(p_osm);
> osm_sa_destroy(&p_osm->sa);
> osm_sm_destroy(&p_osm->sm);
> #ifdef ENABLE_OSM_PERF_MGR
> @@ -384,6 +434,9 @@ osm_opensm_init(IN osm_opensm_t * const p_osm,
>
> setup_routing_engine(p_osm, p_opt->routing_engine_name);
>
> + if (!p_osm->routing_engine_list)
> + setup_default_routing_engine(p_osm);
> +
This (default engine setup) is duplicated in setup_routing_engine().
> p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE;
>
> p_osm->node_name_map = open_node_name_map(p_opt->node_name_map_name);
> diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
> index b8272ee..f905eab 100644
> --- a/opensm/opensm/osm_ucast_mgr.c
> +++ b/opensm/opensm/osm_ucast_mgr.c
> @@ -245,20 +245,48 @@ static int ucast_mgr_setup_all_switches(osm_subn_t * p_subn)
>
> /**********************************************************************
> **********************************************************************/
> +int _osm_ucast_mgr_route(struct osm_routing_engine *p_routing_eng,
> + osm_opensm_t *p_osm)
> +{
> + int blm = -1;
> + int ubft = -1;
> +
> + CL_ASSERT(p_routing_eng->build_lid_matrices);
> + CL_ASSERT(p_routing_eng->ucast_build_fwd_tables);
> +
> + blm = p_routing_eng->build_lid_matrices(p_routing_eng->context);
> +
> + /*
> + Now that the lid matrices have been built, we can
> + build and download the switch forwarding tables.
> + */
> + if (!blm)
> + ubft = p_routing_eng->ucast_build_fwd_tables(p_routing_eng->context);
> +
> + if (!blm && !ubft) {
> + p_osm->routing_engine_used =
> + osm_routing_engine_type(p_routing_eng->name);
> + return 0;
> + }
> +
> + OSM_LOG(&p_osm->log, OSM_LOG_DEBUG,
> + "failed to route using routing algorithm %s\n",
> + p_routing_eng->name);
> + return -1;
> +}
> +
> osm_signal_t osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
> {
> osm_opensm_t *p_osm;
> struct osm_routing_engine *p_routing_eng;
> osm_signal_t signal = OSM_SIGNAL_DONE;
> cl_qmap_t *p_sw_guid_tbl;
> - int blm = -1;
> - int ubft = -1;
>
> OSM_LOG_ENTER(p_mgr->p_log);
>
> 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;
> + p_routing_eng = p_osm->routing_engine_list;
>
> CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock);
>
> @@ -271,22 +299,14 @@ osm_signal_t osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
>
> p_mgr->any_change = FALSE;
>
> - CL_ASSERT(p_routing_eng->build_lid_matrices);
> - CL_ASSERT(p_routing_eng->ucast_build_fwd_tables);
> -
> - blm = p_routing_eng->build_lid_matrices(p_routing_eng->context);
> -
> - /*
> - Now that the lid matrices have been built, we can
> - build and download the switch forwarding tables.
> - */
> - if (!blm)
> - ubft = p_routing_eng->ucast_build_fwd_tables(p_routing_eng->context);
> + p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE;
> + while (p_routing_eng) {
> + if (!_osm_ucast_mgr_route(p_routing_eng, p_osm))
> + break;
> + p_routing_eng = p_routing_eng->next;
> + }
>
> - if (!blm && !ubft)
> - p_osm->routing_engine_used =
> - osm_routing_engine_type(p_routing_eng->name);
> - else {
> + if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) {
> /* If configured routing algorithm failed, use default MinHop */
> osm_ucast_minhop_no_failure_build_lid_matrices(p_osm);
> osm_ucast_minhop_no_failure_build_fwd_tables(p_osm);
> --
> 1.5.4.5
>
More information about the general
mailing list