[openib-general] [PATCH] opensm: mcast tables dump improvement

Sasha Khapyorsky sashak at voltaire.com
Thu Oct 12 17:35:17 PDT 2006


This improves switch's mcast tables dumping and eliminates multiple file
open/seek/close sequences. In one word - cleanup.

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
 osm/opensm/osm_mcast_mgr.c |  108 +++++++++++++++++++++-----------------------
 1 files changed, 52 insertions(+), 56 deletions(-)

diff --git a/osm/opensm/osm_mcast_mgr.c b/osm/opensm/osm_mcast_mgr.c
index cb0ffb1..f4d6954 100644
--- a/osm/opensm/osm_mcast_mgr.c
+++ b/osm/opensm/osm_mcast_mgr.c
@@ -53,6 +53,7 @@ #endif /* HAVE_CONFIG_H */
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include <iba/ib_types.h>
 #include <complib/cl_debug.h>
 #include <opensm/osm_mcast_mgr.h>
@@ -1377,10 +1378,12 @@ osm_mcast_mgr_process_tree(
 
 /**********************************************************************
  **********************************************************************/
+
 static void
-osm_mcast_mgr_dump_mcast_routes(
+mcast_mgr_dump_sw_routes(
   IN const osm_mcast_mgr_t*   const p_mgr,
-  IN const osm_switch_t*      const p_sw )
+  IN const osm_switch_t*      const p_sw,
+  IN FILE *p_mcfdbFile)
 {
   osm_mcast_tbl_t*      p_tbl;
   int16_t               mlid_ho = 0;
@@ -1390,35 +1393,14 @@ osm_mcast_mgr_dump_mcast_routes(
   char                  line[OSM_REPORT_LINE_SIZE];
   boolean_t             print_lid;
   const osm_node_t*     p_node;
-  FILE  *               p_mcfdbFile;
   uint16_t              i, j;
   uint16_t              mask_entry;
-  char                 *file_name = NULL;
 
-  OSM_LOG_ENTER( p_mgr->p_log, osm_mcast_mgr_dump_mcast_routes );
+  OSM_LOG_ENTER( p_mgr->p_log, mcast_mgr_dump_sw_routes );
   
   if( !osm_log_is_active( p_mgr->p_log, OSM_LOG_ROUTING ) )
     goto Exit;
 
-  file_name = 
-    (char*)malloc(strlen(p_mgr->p_subn->opt.dump_files_dir) + 12);
-  
-  CL_ASSERT(file_name);
-  
-  strcpy(file_name, p_mgr->p_subn->opt.dump_files_dir);
-  strcat(file_name, "/osm.mcfdbs");
-  
-  /* Open the file or error */
-  p_mcfdbFile = fopen(file_name, "a");
-  if (! p_mcfdbFile)
-  {
-    osm_log( p_mgr->p_log, OSM_LOG_ERROR,
-             "osm_mcast_mgr_dump_mcast_routes: ERR 0A23: "
-             "Failed to open mcfdb file (%s)\n",
-             file_name );
-    goto Exit;
-  }
-
   p_node = osm_switch_get_node_ptr( p_sw );
 
   p_tbl = osm_switch_get_mcast_tbl_ptr( p_sw );
@@ -1459,30 +1441,56 @@ osm_mcast_mgr_dump_mcast_routes(
     block_num++;
   }
 
-  fclose(p_mcfdbFile);
-
  Exit:
-  if (file_name)
-    free(file_name);
   OSM_LOG_EXIT( p_mgr->p_log );
 }
 
+/**********************************************************************
+ **********************************************************************/
+
+struct mcast_mgr_dump_context {
+	osm_mcast_mgr_t *p_mgr;
+	FILE *file;
+};
+
 static void
-__unlink_mcast_fdb(IN osm_mcast_mgr_t* const p_mgr)
+mcast_mgr_dump_table(cl_map_item_t *p_map_item, void *context)
 {
-  char *file_name = NULL;
+	osm_switch_t *p_sw = (osm_switch_t *)p_map_item;
+	struct mcast_mgr_dump_context *cxt = context;
 
-  /* remove the old fdb dump file: */
-  file_name =
-    (char*)malloc(strlen(p_mgr->p_subn->opt.dump_files_dir) + 12);
+	mcast_mgr_dump_sw_routes(cxt->p_mgr, p_sw, cxt->file);
+}
 
-  if( file_name )
-  {
-    strcpy(file_name, p_mgr->p_subn->opt.dump_files_dir);
-    strcat(file_name, "/osm.mcfdbs");
-    unlink(file_name);
-    free(file_name);
-  }
+static void
+mcast_mgr_dump_mcast_routes(osm_mcast_mgr_t *p_mgr)
+{
+	char file_name[1024];
+	struct mcast_mgr_dump_context dump_context;
+	FILE  *file;
+
+	if (!osm_log_is_active(p_mgr->p_log, OSM_LOG_ROUTING))
+		return;
+
+	snprintf(file_name, sizeof(file_name), "%s/%s",
+		 p_mgr->p_subn->opt.dump_files_dir, "osm.mcfdbs");
+ 
+ 	file = fopen(file_name, "w");
+	if (!file) {
+		osm_log(p_mgr->p_log, OSM_LOG_ERROR,
+			"mcast_dump_mcast_routes: ERR 0A18: "
+			"cannot create mcfdb file \'%s\': %s\n",
+			file_name, strerror(errno));
+		return;
+	}
+
+	dump_context.p_mgr = p_mgr;
+	dump_context.file = file;
+
+	cl_qmap_apply_func(&p_mgr->p_subn->sw_guid_tbl,
+			   mcast_mgr_dump_table, &dump_context);
+
+	fclose(file);
 }
 
 /**********************************************************************
@@ -1518,12 +1526,6 @@ osm_mcast_mgr_process_mgrp(
     goto Exit;
   }
 
-  /* initialize the mc fdb dump file: */
-  if( osm_log_is_active( p_mgr->p_log, OSM_LOG_ROUTING ) )
-  {
-    __unlink_mcast_fdb( p_mgr );
-  }
-
   /*
     Walk the switches and download the tables for each.
   */
@@ -1534,11 +1536,11 @@ osm_mcast_mgr_process_mgrp(
     if( signal == OSM_SIGNAL_DONE_PENDING )
       pending_transactions = TRUE;
 
-    osm_mcast_mgr_dump_mcast_routes( p_mgr, p_sw );
-
     p_sw = (osm_switch_t*)cl_qmap_next( &p_sw->map_item );
   }
 
+  mcast_mgr_dump_mcast_routes( p_mgr );
+
  Exit:
   OSM_LOG_EXIT( p_mgr->p_log );
 
@@ -1594,12 +1596,6 @@ osm_mcast_mgr_process(
     p_mgrp = (osm_mgrp_t*)cl_qmap_next( &p_mgrp->map_item );
   }
 
-  /* initialize the mc fdb dump file: */
-  if( osm_log_is_active( p_mgr->p_log, OSM_LOG_ROUTING ) )
-  {
-    __unlink_mcast_fdb( p_mgr );
-  }
-
   /*
     Walk the switches and download the tables for each.
   */
@@ -1610,11 +1606,11 @@ osm_mcast_mgr_process(
     if( signal == OSM_SIGNAL_DONE_PENDING )
       pending_transactions = TRUE;
 
-    osm_mcast_mgr_dump_mcast_routes( p_mgr, p_sw );
-
     p_sw = (osm_switch_t*)cl_qmap_next( &p_sw->map_item );
   }
 
+  mcast_mgr_dump_mcast_routes( p_mgr );
+
   CL_PLOCK_RELEASE( p_mgr->p_lock );
 
   OSM_LOG_EXIT( p_mgr->p_log );
-- 
1.4.2.3.g128e





More information about the general mailing list