[openib-general] [PATCH] OpenSM - honor guid2lid when coming out of standby

Yael Kalka yael at mellanox.co.il
Sun Mar 12 04:45:21 PST 2006


Hi Hal,

The following patch adds an option to the opensm that forces it to
honor the guid2lid file given when it comes out of Standby state.
Currently, when opensm comes out of Standby state it ignores the
guid2lid file it read, and honors only the lids defined on the ports
themselves.
This patch enables to run opensm with --honor_guid2lid flag, and that
forces the opensm to re-read the guid2lid file when it comes out of
Standby, and if this file is legal - honor it.

Thanks,
Yael

Signed-off-by:  Yael Kalka <yael at mellanox.co.il>

Index: include/opensm/osm_subnet.h
===================================================================
--- include/opensm/osm_subnet.h	(revision 5751)
+++ include/opensm/osm_subnet.h	(working copy)
@@ -239,6 +239,7 @@ typedef struct _osm_subn_opt
   boolean_t                updn_activate;
   char *                   updn_guid_file;
   boolean_t                exit_on_fatal;
+  boolean_t                honor_guid2lid_file;
 } osm_subn_opt_t;
 /*
 * FIELDS
@@ -383,6 +384,11 @@ typedef struct _osm_subn_opt
 *     a. SM recognizes 2 different nodes with the same guid, or 12x link with
 *        lane reversal badly configured.
 *
+*  honor_guid2lid_file
+*     Always honor the guid2lid file if it exists and is valid. This means that
+*     the file will be honored when SM is coming out of STANDBY. 
+*     By default this is FALSE.
+*
 * SEE ALSO
 *	Subnet object
 *********/
Index: opensm/osm_subnet.c
===================================================================
--- opensm/osm_subnet.c	(revision 5751)
+++ opensm/osm_subnet.c	(working copy)
@@ -437,6 +437,8 @@ osm_subn_set_default_opt(
   p_opt->polling_retry_number = 4;
   p_opt->force_heavy_sweep = FALSE;
   p_opt->log_flags = 0;
+  p_opt->honor_guid2lid_file = FALSE;
+
   p_opt->dump_files_dir = getenv("OSM_TMP_DIR");
   if (!p_opt->dump_files_dir)
     p_opt->dump_files_dir = OSM_DEFAULT_TMP_DIR;
@@ -786,6 +788,11 @@ osm_subn_parse_conf_file(
       __osm_subn_opts_unpack_boolean(
         "exit_on_fatal",
         p_key, p_val, &p_opts->exit_on_fatal);
+
+      __osm_subn_opts_unpack_boolean( 
+        "honor_guid2lid_file",
+        p_key, p_val, &p_opts->honor_guid2lid_file);
+
     }
   }
   fclose(opts_file);
@@ -909,11 +916,15 @@ osm_subn_write_conf_file(
     "# Timeout in [sec] between two polls of active master SM\n"
     "sminfo_polling_timeout %u\n\n"
     "# Number of failing polls of remote SM that declares it dead\n"
-    "polling_retry_number %u\n\n",
+    "polling_retry_number %u\n"
+    "# If true honor the guid2lid file when coming out of standby\n"
+    "# state, if such file exists and is valid\n"
+    "honor_guid2lid_file %s\n\n",
     p_opts->sm_priority,
     p_opts->ignore_other_sm ? "TRUE" : "FALSE",
     p_opts->sminfo_polling_timeout,
-    p_opts->polling_retry_number
+    p_opts->polling_retry_number,
+    p_opts->honor_guid2lid_file ? "TRUE" : "FALSE"
     );
     
   fprintf(
Index: opensm/main.c
===================================================================
--- opensm/main.c	(revision 5751)
+++ opensm/main.c	(working copy)
@@ -214,6 +214,12 @@ show_usage(void)
           "          This option provides the means to define a set of ports\n"
           "          (by guids) that will be ignored by the link load\n"
           "          equalization algorithm.\n\n" );
+  printf( "-x\n"
+          "--honor_guid2lid\n"
+          "          This option forces OpenSM to honor the guid2lid file,\n"
+          "          when it comes out of Standby state, if such file exists\n"
+          "          under OSM_CACHE_DIR, and is valid.\n"
+          "          By default this is FALSE.\n" );
   printf( "-f\n"
           "--log_file\n"
           "          This option defines the log to be the given file.\n"
@@ -515,7 +521,7 @@ main(
   boolean_t             cache_options = FALSE;
   char                 *ignore_guids_file_name = NULL;
   uint32_t              val;
-  const char * const    short_option = "i:f:ed:g:l:s:t:a:P:uvVhorcy";
+  const char * const    short_option = "i:f:ed:g:l:s:t:a:P:uvVhorcyx";
 
   /*
     In the array below, the 2nd parameter specified the number
@@ -549,6 +555,7 @@ main(
       {  "add_guid_file", 1, NULL, 'a'},
       {  "cache-options", 0, NULL, 'c'},
       {  "stay_on_fatal", 0, NULL, 'y'},
+      {  "honor_guid2lid", 0, NULL, 'x'},
       {  NULL,            0, NULL,  0 }  /* Required at the end of the array */
     };
 
@@ -778,6 +785,11 @@ main(
       printf (" Caching command line options\n");
       break;
 
+    case 'x':
+      opt.honor_guid2lid_file = TRUE;
+      printf (" Honor guid2lid file, if possible\n");
+      break;
+
     case 'h':
     case '?':
     case ':':
Index: opensm/osm_lid_mgr.c
===================================================================
--- opensm/osm_lid_mgr.c	(revision 5751)
+++ opensm/osm_lid_mgr.c	(working copy)
@@ -359,13 +359,32 @@ __osm_lid_mgr_init_sweep(
     lmc_mask = 0xffff;
 
   /* if we came out of standby we need to discard any previous guid2lid
-     info we might have */
+     info we might have. 
+     Do this only if the honor_guid2lid_file option is FALSE. If not - then
+     need to honor this file. */
   if ( p_mgr->p_subn->coming_out_of_standby == TRUE )
   {
+    if ( p_mgr->p_subn->opt.honor_guid2lid_file == FALSE )
+    {
+      osm_log( p_mgr->p_log, OSM_LOG_DEBUG,
+               "__osm_lid_mgr_init_sweep: "
+               "Ignore guid2lid file when coming out of standby\n");
     osm_db_clear( p_mgr->p_g2l );
     for (lid = 0; lid < cl_ptr_vector_get_size(&p_mgr->used_lids); lid++)
       cl_ptr_vector_set(p_persistent_vec, lid, NULL);
   }
+    else
+    {
+      osm_log( p_mgr->p_log, OSM_LOG_DEBUG,
+               "__osm_lid_mgr_init_sweep: "
+               "Honor current guid2lid file when coming out of standby\n");
+      osm_db_clear( p_mgr->p_g2l );
+      if (osm_db_restore(p_mgr->p_g2l))
+        osm_log( p_mgr->p_log, OSM_LOG_ERROR,
+                 "osm_lid_mgr_init_sweep: ERR 0306: " 
+                 "Error restore Guid-to-Lid persistant database. Ignoring it.\n");
+    }
+  }
 
   /* we need to cleanup the empty ranges list */
   p_item = cl_qlist_remove_head( &p_mgr->free_ranges );




More information about the general mailing list