[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