[ofa-general] [PATCH 4/7] Change node name map implementation to use qmap in memory storage

Ira Weiny weiny2 at llnl.gov
Thu Nov 1 20:15:14 PDT 2007


>From 2dacfc928856351820fadc416da787350254419e Mon Sep 17 00:00:00 2001
From: Ira K. Weiny <weiny2 at llnl.gov>
Date: Thu, 1 Nov 2007 19:29:02 -0700
Subject: [PATCH] Change node name map implementation to use qmap in memory storage

Signed-off-by: Ira K. Weiny <weiny2 at llnl.gov>
---
 infiniband-diags/src/ibnetdiscover.c    |   18 +++---
 infiniband-diags/src/ibroute.c          |    1 +
 infiniband-diags/src/ibtracert.c        |   16 ++--
 infiniband-diags/src/saquery.c          |   12 ++--
 infiniband-diags/src/smpquery.c         |   12 ++--
 opensm/complib/cl_nodenamemap.c         |  116 ++++++++++++++++++++----------
 opensm/include/complib/cl_nodenamemap.h |   19 ++++-
 7 files changed, 122 insertions(+), 72 deletions(-)

diff --git a/infiniband-diags/src/ibnetdiscover.c b/infiniband-diags/src/ibnetdiscover.c
index 03ef6f9..8b229c1 100644
--- a/infiniband-diags/src/ibnetdiscover.c
+++ b/infiniband-diags/src/ibnetdiscover.c
@@ -92,8 +92,8 @@ static FILE *f;
 
 char *argv0 = "ibnetdiscover";
 
-static char *node_name_map = NULL;
-static FILE *node_name_map_fp = NULL;
+static char *node_name_map_file = NULL;
+static nn_map_t *node_name_map = NULL;
 
 Node *nodesdist[MAXHOPS+1];     /* last is Ca list */
 Node *mynode;
@@ -460,7 +460,7 @@ void
 list_node(Node *node)
 {
 	char *node_type;
-	char *nodename = remap_node_name(node_name_map_fp, node->nodeguid,
+	char *nodename = remap_node_name(node_name_map, node->nodeguid,
 					      node->nodedesc);
 
 	switch(node->type) {
@@ -537,7 +537,7 @@ out_switch(Node *node, int group, char *chname)
 		fprintf(f, "%d Chip %d", node->chrecord->slotnum, node->chrecord->anafanum);
 	}
 
-	nodename = remap_node_name(node_name_map_fp, node->nodeguid,
+	nodename = remap_node_name(node_name_map, node->nodeguid,
 				node->nodedesc);
 
 	fprintf(f, "\nSwitch\t%d %s\t\t# \"%s\" %s port 0 lid %d lmc %d\n",
@@ -606,7 +606,7 @@ out_switch_port(Port *port, int group)
 	if (ext_port_str)
 		fprintf(f, "%s", ext_port_str);
 
-	rem_nodename = remap_node_name(node_name_map_fp,
+	rem_nodename = remap_node_name(node_name_map,
 				port->remoteport->node->nodeguid,
 				port->remoteport->node->nodedesc);
 
@@ -650,7 +650,7 @@ out_ca_port(Port *port, int group)
 	if (port->remoteport->node->type != SWITCH_NODE)
 		fprintf(f, " (%" PRIx64 ") ", port->remoteport->portguid);
 
-	rem_nodename = remap_node_name(node_name_map_fp,
+	rem_nodename = remap_node_name(node_name_map,
 				port->remoteport->node->nodeguid,
 				port->remoteport->node->nodedesc);
 
@@ -890,7 +890,7 @@ main(int argc, char **argv)
 			break;
 		switch(ch) {
 		case 1:
-			node_name_map = strdup(optarg);
+			node_name_map_file = strdup(optarg);
 			break;
 		case 'C':
 			ca = optarg;
@@ -947,7 +947,7 @@ main(int argc, char **argv)
 		IBERROR("can't open file %s for writing", argv[0]);
 
 	madrpc_init(ca, ca_port, mgmt_classes, 2);
-	node_name_map_fp = open_node_name_map(node_name_map);
+	node_name_map = open_node_name_map(node_name_map_file);
 
 	if (discover(&my_portid) < 0)
 		IBERROR("discover");
@@ -957,6 +957,6 @@ main(int argc, char **argv)
 
 	dump_topology(list, group);
 
-	close_node_name_map(node_name_map_fp);
+	close_node_name_map(node_name_map);
 	exit(0);
 }
diff --git a/infiniband-diags/src/ibroute.c b/infiniband-diags/src/ibroute.c
index 44d2fc8..664f7f5 100644
--- a/infiniband-diags/src/ibroute.c
+++ b/infiniband-diags/src/ibroute.c
@@ -50,6 +50,7 @@
 #include <infiniband/common.h>
 #include <infiniband/umad.h>
 #include <infiniband/mad.h>
+#include <infiniband/complib/cl_nodenamemap.h>
 
 #include "ibdiag_common.h"
 
diff --git a/infiniband-diags/src/ibtracert.c b/infiniband-diags/src/ibtracert.c
index c8a7b19..010f45f 100644
--- a/infiniband-diags/src/ibtracert.c
+++ b/infiniband-diags/src/ibtracert.c
@@ -71,8 +71,8 @@ static FILE *f;
 
 char *argv0 = "ibtracert";
 
-static char *node_name_map = NULL;
-static FILE *node_name_map_fp = NULL;
+static char *node_name_map_file = NULL;
+static nn_map_t *node_name_map = NULL;
 
 typedef struct Port Port;
 typedef struct Switch Switch;
@@ -205,7 +205,7 @@ dump_endnode(int dump, char *prompt, Node *node, Port *port)
 		return;
 	}
 
-	nodename = remap_node_name(node_name_map_fp, node->nodeguid, node->nodedesc);
+	nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
 	fprintf(f, "%s %s {0x%016" PRIx64 "} portnum %d lid 0x%x-0x%x \"%s\"\n",
 		prompt,
@@ -225,7 +225,7 @@ dump_route(int dump, Node *node, int outport, Port *port)
 	if (!dump && !verbose)
 		return;
 
-	nodename = remap_node_name(node_name_map_fp, node->nodeguid, node->nodedesc);
+	nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
 	if (dump == 1)
 		fprintf(f, "[%d] -> {0x%016" PRIx64 "}[%d]\n",
@@ -637,7 +637,7 @@ dump_mcpath(Node *node, int dumplevel)
 	if (node->upnode)
 		dump_mcpath(node->upnode, dumplevel);
 
-	nodename = remap_node_name(node_name_map_fp, node->nodeguid, node->nodedesc);
+	nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
 	if (!node->dist) {
 		printf("From %s 0x%" PRIx64 " port %d lid 0x%x-0x%x \"%s\"\n",
@@ -741,7 +741,7 @@ main(int argc, char **argv)
 			break;
 		switch(ch) {
 		case 1:
-			node_name_map = strdup(optarg);
+			node_name_map_file = strdup(optarg);
 			break;
 		case 'C':
 			ca = optarg;
@@ -799,7 +799,7 @@ main(int argc, char **argv)
 		usage();
 
 	madrpc_init(ca, ca_port, mgmt_classes, 3);
-	node_name_map_fp = open_node_name_map(node_name_map);
+	node_name_map = open_node_name_map(node_name_map_file);
 
 	if (ib_resolve_portid_str(&src_portid, argv[0], dest_type, sm_id) < 0)
 		IBERROR("can't resolve source port %s", argv[0]);
@@ -838,6 +838,6 @@ main(int argc, char **argv)
 	/* dump multicast path */
 	dump_mcpath(endnode, dumplevel);
 
-	close_node_name_map(node_name_map_fp);
+	close_node_name_map(node_name_map);
 	exit(0);
 }
diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c
index a8d810f..c6cc0a2 100644
--- a/infiniband-diags/src/saquery.c
+++ b/infiniband-diags/src/saquery.c
@@ -60,8 +60,8 @@
 
 char *argv0 = "saquery";
 
-static char *node_name_map = NULL;
-static FILE *node_name_map_fp = NULL;
+static char *node_name_map_file = NULL;
+static nn_map_t *node_name_map = NULL;
 
 /**
  * Declare some globals because I don't want this to be too complex.
@@ -137,7 +137,7 @@ print_node_record(ib_node_record_t *node_record)
 		return;
 	case NAME_OF_LID:
 	case NAME_OF_GUID:
-		name = remap_node_name(node_name_map_fp,
+		name = remap_node_name(node_name_map,
 					  cl_ntoh64(p_ni->node_guid),
 					  (char *)p_nd->description);
 		printf("%s\n", name);
@@ -1143,7 +1143,7 @@ main(int argc, char **argv)
 			break;
 		}
 		case 2:
-			node_name_map = strdup(optarg);
+			node_name_map_file = strdup(optarg);
 			break;
 		case 'p':
 			query_type = IB_MAD_ATTR_PATH_RECORD;
@@ -1248,7 +1248,7 @@ main(int argc, char **argv)
 	}
 
 	bind_handle = get_bind_handle();
-	node_name_map_fp = open_node_name_map(node_name_map);
+	node_name_map = open_node_name_map(node_name_map_file);
 
 	switch (query_type) {
 	case IB_MAD_ATTR_NODE_RECORD:
@@ -1294,6 +1294,6 @@ main(int argc, char **argv)
 	if (dst)
 		free(dst);
 	clean_up();
-	close_node_name_map(node_name_map_fp);
+	close_node_name_map(node_name_map);
 	return (status);
 }
diff --git a/infiniband-diags/src/smpquery.c b/infiniband-diags/src/smpquery.c
index 7c2c129..89b48f3 100644
--- a/infiniband-diags/src/smpquery.c
+++ b/infiniband-diags/src/smpquery.c
@@ -85,8 +85,8 @@ static const match_rec_t match_tbl[] = {
 };
 
 char *argv0 = "smpquery";
-static char *node_name_map = NULL;
-static FILE *node_name_map_fp = NULL;
+static char *node_name_map_file = NULL;
+static nn_map_t *node_name_map = NULL;
 
 /*******************************************/
 static char *
@@ -108,7 +108,7 @@ node_desc(ib_portid_t *dest, char **argv, int argc)
 	if (!smp_query(nd, dest, IB_ATTR_NODE_DESC, 0, 0))
 		return "node desc query failed";
 
-	nodename = remap_node_name(node_name_map_fp, node_guid, nd);
+	nodename = remap_node_name(node_name_map, node_guid, nd);
 
 	l = strlen(nodename);
 	if (l < 32) {
@@ -457,7 +457,7 @@ main(int argc, char **argv)
 			break;
 		switch(ch) {
 		case 1:
-			node_name_map = strdup(optarg);
+			node_name_map_file = strdup(optarg);
 			break;
 		case 'd':
 			ibdebug++;
@@ -513,7 +513,7 @@ main(int argc, char **argv)
 		IBERROR("operation '%s' not supported", argv[0]);
 
 	madrpc_init(ca, ca_port, mgmt_classes, 3);
-	node_name_map_fp = open_node_name_map(node_name_map);
+	node_name_map = open_node_name_map(node_name_map_file);
 
 	if (dest_type != IB_DEST_DRSLID) {
 		if (ib_resolve_portid_str(&portid, argv[1], dest_type, sm_id) < 0)
@@ -530,6 +530,6 @@ main(int argc, char **argv)
 		if ((err = fn(&portid, argv+3, argc-3)))
 			IBERROR("operation %s: %s", argv[0], err);
 	}
-	close_node_name_map(node_name_map_fp);
+	close_node_name_map(node_name_map);
 	exit(0);
 }
diff --git a/opensm/complib/cl_nodenamemap.c b/opensm/complib/cl_nodenamemap.c
index 144a7e4..584c78c 100644
--- a/opensm/complib/cl_nodenamemap.c
+++ b/opensm/complib/cl_nodenamemap.c
@@ -44,67 +44,105 @@
 
 #include <complib/cl_nodenamemap.h>
 
-FILE *
+static nn_map_t *
+read_names(nn_map_t *map)
+{
+	char *line = NULL;
+	size_t len = 0;
+	name_map_item_t *item;
+
+	rewind(map->fp);
+	while (getline(&line, &len, map->fp) != -1) {
+		char *guid_str = NULL;
+		char *name = NULL;
+		line[len-1] = '\0';
+		if (line[0] == '#')
+			goto next_one;
+
+		guid_str = strtok(line, "\"#");
+		name = strtok(NULL, "\"#");
+		if (!guid_str || !name)
+			goto next_one;
+
+		item = malloc(sizeof(*item));
+		if (!item) {
+			goto error;
+		}
+		item->guid = strtoull(guid_str, NULL, 0);
+		item->name = strdup(name);
+		cl_qmap_insert(&(map->map), item->guid, (cl_map_item_t *)item);
+
+next_one:
+		free (line);
+		line = NULL;
+	}
+
+error:
+	return (map);
+}
+
+nn_map_t *
 open_node_name_map(char *node_name_map)
 {
-	FILE *rc = NULL;
+	FILE *tmp_fp = NULL;
+	nn_map_t *rc = NULL;
 
 	if (node_name_map != NULL) {
-		rc = fopen(node_name_map, "r");
-		if (rc == NULL) {
+		tmp_fp = fopen(node_name_map, "r");
+		if (tmp_fp == NULL) {
 			fprintf(stderr,
 				"WARNING failed to open switch map \"%s\" (%s)\n",
 				node_name_map, strerror(errno));
 		}
 #ifdef HAVE_DEFAULT_NODENAME_MAP
 	} else {
-		rc = fopen(HAVE_DEFAULT_NODENAME_MAP, "r");
+		tmp_fp = fopen(HAVE_DEFAULT_NODENAME_MAP, "r");
 #endif /* HAVE_DEFAULT_NODENAME_MAP */
 	}
-	return (rc);
+	if (!tmp_fp)
+		return (NULL);
+
+	rc = malloc(sizeof(*rc));
+	if (!rc)
+		return (NULL);
+	rc->fp = tmp_fp;
+	cl_qmap_init(&(rc->map));
+	return (read_names(rc));
 }
 
 void
-close_node_name_map(FILE *fp)
+close_node_name_map(nn_map_t *map)
 {
-	if (fp)
-		fclose(fp);
+	name_map_item_t *item = NULL;
+
+	if (!map)
+		return;
+
+	item = (name_map_item_t *)cl_qmap_head(&(map->map));
+	while (item != cl_qmap_end(&(map->map))) {
+		item = (name_map_item_t *)cl_qmap_remove(&(map->map), item->guid);
+		free(item->name);
+		free(item);
+		item = (name_map_item_t *)cl_qmap_head(&(map->map));
+	}
+	if (map->fp)
+		fclose(map->fp);
+	free(map);
 }
 
 char *
-remap_node_name(FILE *node_name_map_fp, uint64_t target_guid, char *nodedesc)
+remap_node_name(nn_map_t *map, uint64_t target_guid, char *nodedesc)
 {
-#define NAME_LEN (256)
-	char     *line = NULL;
-	size_t    len = 0;
-	uint64_t  guid = 0;
-	char     *rc = NULL;
-	int       line_count = 0;
-
-	if (node_name_map_fp == NULL)
+	char *rc = NULL;
+	name_map_item_t *item = NULL;
+
+	if (!map)
 		goto done;
 
-	rewind(node_name_map_fp);
-	for (line_count = 1;
-		getline(&line, &len, node_name_map_fp) != -1;
-		line_count++) {
-		line[len-1] = '\0';
-		if (line[0] == '#')
-			goto next_one;
-		char *guid_str = strtok(line, "\"#");
-		char *name = strtok(NULL, "\"#");
-		if (!guid_str || !name)
-			goto next_one;
-		guid = strtoull(guid_str, NULL, 0);
-		if (target_guid == guid) {
-			rc = strdup(name);
-			free (line);
-			goto done;
-		}
-next_one:
-		free (line);
-		line = NULL;
-	}
+	item = (name_map_item_t *)cl_qmap_get(&(map->map), target_guid);
+	if (item != cl_qmap_end(&(map->map)))
+		rc = strdup(item->name);
+
 done:
 	if (rc == NULL)
 		rc = strdup(clean_nodedesc(nodedesc));
diff --git a/opensm/include/complib/cl_nodenamemap.h b/opensm/include/complib/cl_nodenamemap.h
index a4a09f7..9d0b7d4 100644
--- a/opensm/include/complib/cl_nodenamemap.h
+++ b/opensm/include/complib/cl_nodenamemap.h
@@ -36,17 +36,28 @@
 
 #include <stdio.h>
 #include <stdint.h>
+#include <complib/cl_qmap.h>
 
-/* NOTE: this modifies the parameter "nodedesc". */
+/* NOTE: this may modify the parameter "nodedesc". */
 char *clean_nodedesc(char *nodedesc);
 
+typedef struct _name_map_item {
+	cl_map_item_t item;
+	uint64_t guid;
+	char *name;
+} name_map_item_t;
+typedef struct _node_name_map {
+	FILE *fp;
+	cl_qmap_t map;
+} nn_map_t;
+
 /**
  * Node name map interface.
  * It is OK to pass NULL for the node_name_map[_fp] parameters.
  */
-FILE *open_node_name_map(char *node_name_map);
-void  close_node_name_map(FILE *node_name_map_fp);
-char *remap_node_name(FILE *node_name_map_fp, uint64_t target_guid,
+nn_map_t *open_node_name_map(char *node_name_map);
+void  close_node_name_map(nn_map_t *map);
+char *remap_node_name(nn_map_t *map, uint64_t target_guid,
 			char *nodedesc);
 	/* NOTE: parameter "nodedesc" may be modified here. */
 
-- 
1.5.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0004-Change-node-name-map-implementation-to-use-qmap-in-m.patch
Type: application/octet-stream
Size: 13407 bytes
Desc: not available
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20071101/e9cb5cb9/attachment.obj>


More information about the general mailing list