[ofa-general] [PATCH 5/5] infiniband-diags/libibnetdisc: remove members of the fabric struct which are used in the scan only.
Ira Weiny
weiny2 at llnl.gov
Thu Aug 13 20:43:16 PDT 2009
From: Ira Weiny <weiny2 at llnl.gov>
Date: Thu, 13 Aug 2009 20:27:41 -0700
Subject: [PATCH] infiniband-diags/libibnetdisc: remove members of the fabric struct which are used in the scan only.
Signed-off-by: Ira Weiny <weiny2 at llnl.gov>
---
.../libibnetdisc/include/infiniband/ibnetdisc.h | 7 --
infiniband-diags/libibnetdisc/src/chassis.c | 52 +++++++-------
infiniband-diags/libibnetdisc/src/chassis.h | 2 +-
infiniband-diags/libibnetdisc/src/ibnetdisc.c | 80 ++++++++++++--------
infiniband-diags/libibnetdisc/src/internal.h | 13 +++
5 files changed, 88 insertions(+), 66 deletions(-)
diff --git a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
index 65ba74f..da14942 100644
--- a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
+++ b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
@@ -130,8 +130,6 @@ typedef struct ibnd_chassis {
#define HASHGUID(guid) ((uint32_t)(((uint32_t)(guid) * 101) ^ ((uint32_t)((guid) >> 32) * 103)))
#define HTSZ 137
-#define MAXHOPS 63
-
/** =========================================================================
* Fabric
* Main fabric object which is returned and represents the data discovered
@@ -151,14 +149,9 @@ typedef struct ibnd_fabric {
/* internal use only */
ibnd_node_t *nodestbl[HTSZ];
ibnd_port_t *portstbl[HTSZ];
- ibnd_node_t *nodesdist[MAXHOPS + 1];
- ibnd_chassis_t *first_chassis;
- ibnd_chassis_t *current_chassis;
- ibnd_chassis_t *last_chassis;
ibnd_node_t *switches;
ibnd_node_t *ch_adapters;
ibnd_node_t *routers;
- ib_portid_t selfportid;
} ibnd_fabric_t;
/** =========================================================================
diff --git a/infiniband-diags/libibnetdisc/src/chassis.c b/infiniband-diags/libibnetdisc/src/chassis.c
index 4886cfc..d11d7df 100644
--- a/infiniband-diags/libibnetdisc/src/chassis.c
+++ b/infiniband-diags/libibnetdisc/src/chassis.c
@@ -96,7 +96,7 @@ static ibnd_chassis_t *find_chassisnum(ibnd_fabric_t * fabric,
{
ibnd_chassis_t *current;
- for (current = fabric->first_chassis; current; current = current->next) {
+ for (current = fabric->chassis; current; current = current->next) {
if (current->chassisnum == chassisnum)
return current;
}
@@ -207,14 +207,14 @@ static uint64_t get_chassisguid(ibnd_node_t * node)
return sysimgguid;
}
-static ibnd_chassis_t *find_chassisguid(ibnd_fabric_t * fabric,
+static ibnd_chassis_t *find_chassisguid(struct ibnd_chassis_ctx *ch_ctx,
ibnd_node_t * node)
{
ibnd_chassis_t *current;
uint64_t chguid;
chguid = get_chassisguid(node);
- for (current = fabric->first_chassis; current; current = current->next) {
+ for (current = ch_ctx->first_chassis; current; current = current->next) {
if (current->chassisguid == chguid)
return current;
}
@@ -782,19 +782,19 @@ static void voltaire_portmap(ibnd_port_t * port)
port->ext_portnum = int2ext_map_slb8[chipnum][portnum];
}
-static int add_chassis(ibnd_fabric_t * fabric)
+static int add_chassis(struct ibnd_chassis_ctx *ch_ctx)
{
- if (!(fabric->current_chassis = calloc(1, sizeof(ibnd_chassis_t)))) {
+ if (!(ch_ctx->current_chassis = calloc(1, sizeof(ibnd_chassis_t)))) {
IBND_ERROR("OOM: failed to allocate chassis object\n");
return (-1);
}
- if (fabric->first_chassis == NULL) {
- fabric->first_chassis = fabric->current_chassis;
- fabric->last_chassis = fabric->current_chassis;
+ if (ch_ctx->first_chassis == NULL) {
+ ch_ctx->first_chassis = ch_ctx->current_chassis;
+ ch_ctx->last_chassis = ch_ctx->current_chassis;
} else {
- fabric->last_chassis->next = fabric->current_chassis;
- fabric->last_chassis = fabric->current_chassis;
+ ch_ctx->last_chassis->next = ch_ctx->current_chassis;
+ ch_ctx->last_chassis = ch_ctx->current_chassis;
}
return (0);
}
@@ -818,22 +818,22 @@ static void add_node_to_chassis(ibnd_chassis_t * chassis, ibnd_node_t * node)
Returns:
0 on success, -1 on failure
*/
-int group_nodes(ibnd_fabric_t * fabric)
+int group_nodes(struct ibnd_scan_ctx *scan_ctx, ibnd_fabric_t * fabric)
{
ibnd_node_t *node;
int dist;
int chassisnum = 0;
ibnd_chassis_t *chassis;
+ struct ibnd_chassis_ctx ch_ctx;
- fabric->first_chassis = NULL;
- fabric->current_chassis = NULL;
+ memset(&ch_ctx, 0, sizeof ch_ctx);
/* first pass on switches and build for every Voltaire node */
/* an appropriate chassis record (slotnum and position) */
/* according to internal connectivity */
/* not very efficient but clear code so... */
for (dist = 0; dist <= fabric->maxhops_discovered; dist++) {
- for (node = fabric->nodesdist[dist]; node; node = node->dnext) {
+ for (node = scan_ctx->nodesdist[dist]; node; node = node->dnext) {
if (mad_get_field(node->info, 0,
IB_NODE_VENDORID_F) == VTR_VENDOR_ID)
if (fill_voltaire_chassis_record(node))
@@ -844,7 +844,7 @@ int group_nodes(ibnd_fabric_t * fabric)
/* separate every Voltaire chassis from each other and build linked list of them */
/* algorithm: catch spine and find all surrounding nodes */
for (dist = 0; dist <= fabric->maxhops_discovered; dist++) {
- for (node = fabric->nodesdist[dist]; node; node = node->dnext) {
+ for (node = scan_ctx->nodesdist[dist]; node; node = node->dnext) {
if (mad_get_field(node->info, 0,
IB_NODE_VENDORID_F) != VTR_VENDOR_ID)
continue;
@@ -852,10 +852,10 @@ int group_nodes(ibnd_fabric_t * fabric)
|| (node->chassis && node->chassis->chassisnum)
|| !is_spine(node))
continue;
- if (add_chassis(fabric))
+ if (add_chassis(&ch_ctx))
return (-1);
- fabric->current_chassis->chassisnum = ++chassisnum;
- if (build_chassis(node, fabric->current_chassis))
+ ch_ctx.current_chassis->chassisnum = ++chassisnum;
+ if (build_chassis(node, ch_ctx.current_chassis))
return (-1);
}
}
@@ -863,25 +863,25 @@ int group_nodes(ibnd_fabric_t * fabric)
/* now make pass on nodes for chassis which are not Voltaire */
/* grouped by common SystemImageGUID */
for (dist = 0; dist <= fabric->maxhops_discovered; dist++) {
- for (node = fabric->nodesdist[dist]; node; node = node->dnext) {
+ for (node = scan_ctx->nodesdist[dist]; node; node = node->dnext) {
if (mad_get_field(node->info, 0,
IB_NODE_VENDORID_F) == VTR_VENDOR_ID)
continue;
if (mad_get_field64(node->info, 0,
IB_NODE_SYSTEM_GUID_F)) {
chassis =
- find_chassisguid(fabric,
+ find_chassisguid(&ch_ctx,
(ibnd_node_t *) node);
if (chassis)
chassis->nodecount++;
else {
/* Possible new chassis */
- if (add_chassis(fabric))
+ if (add_chassis(&ch_ctx))
return (-1);
- fabric->current_chassis->chassisguid =
+ ch_ctx.current_chassis->chassisguid =
get_chassisguid((ibnd_node_t *)
node);
- fabric->current_chassis->nodecount = 1;
+ ch_ctx.current_chassis->nodecount = 1;
}
}
}
@@ -890,14 +890,14 @@ int group_nodes(ibnd_fabric_t * fabric)
/* now, make another pass to see which nodes are part of chassis */
/* (defined as chassis->nodecount > 1) */
for (dist = 0; dist <= MAXHOPS;) {
- for (node = fabric->nodesdist[dist]; node; node = node->dnext) {
+ for (node = scan_ctx->nodesdist[dist]; node; node = node->dnext) {
if (mad_get_field(node->info, 0,
IB_NODE_VENDORID_F) == VTR_VENDOR_ID)
continue;
if (mad_get_field64(node->info, 0,
IB_NODE_SYSTEM_GUID_F)) {
chassis =
- find_chassisguid(fabric,
+ find_chassisguid(&ch_ctx,
(ibnd_node_t *) node);
if (chassis && chassis->nodecount > 1) {
if (!chassis->chassisnum)
@@ -918,6 +918,6 @@ int group_nodes(ibnd_fabric_t * fabric)
dist++;
}
- fabric->chassis = fabric->first_chassis;
+ fabric->chassis = ch_ctx.first_chassis;
return (0);
}
diff --git a/infiniband-diags/libibnetdisc/src/chassis.h b/infiniband-diags/libibnetdisc/src/chassis.h
index 2191046..707140c 100644
--- a/infiniband-diags/libibnetdisc/src/chassis.h
+++ b/infiniband-diags/libibnetdisc/src/chassis.h
@@ -82,6 +82,6 @@ enum ibnd_chassis_type {
};
enum ibnd_chassis_slot_type { UNRESOLVED_CS, LINE_CS, SPINE_CS, SRBD_CS };
-int group_nodes(struct ibnd_fabric *fabric);
+int group_nodes(struct ibnd_scan_ctx *scan_ctx, struct ibnd_fabric *fabric);
#endif /* _CHASSIS_H_ */
diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
index 4b320cd..14f6bf1 100644
--- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c
+++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
@@ -189,21 +189,27 @@ static int add_port_to_dpath(ib_dr_path_t * path, int nextport)
return path->cnt;
}
-static int extend_dpath(struct ibmad_port *ibmad_port, ibnd_fabric_t * fabric,
+static int extend_dpath(struct ibnd_scan_ctx *scan_ctx,
+ struct ibmad_port *ibmad_port, ibnd_fabric_t * fabric,
ib_portid_t * portid, int nextport)
{
int rc = 0;
if (portid->lid) {
+ if (!scan_ctx) {
+ IBND_ERROR("Invalid internal scan state");
+ return (-1);
+ }
/* If we were LID routed we need to set up the drslid */
- if (!fabric->selfportid.lid)
- if (ib_resolve_self_via(&fabric->selfportid, NULL, NULL,
- ibmad_port) < 0) {
+ if (!scan_ctx->selfportid.lid)
+ if (ib_resolve_self_via
+ (&scan_ctx->selfportid, NULL, NULL,
+ ibmad_port) < 0) {
IBND_ERROR("Failed to resolve self\n");
return -1;
}
- portid->drpath.drslid = (uint16_t) fabric->selfportid.lid;
+ portid->drpath.drslid = (uint16_t) scan_ctx->selfportid.lid;
portid->drpath.drdlid = 0xFFFF;
}
@@ -409,19 +415,25 @@ static void add_to_type_list(ibnd_node_t * node, ibnd_fabric_t * fabric)
}
}
-static void add_to_nodedist(ibnd_node_t * node, ibnd_fabric_t * fabric)
+static void add_to_nodedist(ibnd_node_t * node, struct ibnd_scan_ctx *scan_ctx)
{
int dist = node->dist;
+
+ if (!scan_ctx) {
+ IBND_ERROR("Invalid internal scan state");
+ return;
+ }
+
if (node->type != IB_NODE_SWITCH)
dist = MAXHOPS; /* special Ca list */
- node->dnext = fabric->nodesdist[dist];
- fabric->nodesdist[dist] = node;
+ node->dnext = scan_ctx->nodesdist[dist];
+ scan_ctx->nodesdist[dist] = node;
}
-static ibnd_node_t *create_node(ibnd_fabric_t * fabric,
- ibnd_node_t * temp, ib_portid_t * path,
- int dist)
+static ibnd_node_t *create_node(struct ibnd_scan_ctx *scan_ctx,
+ ibnd_fabric_t * fabric, ibnd_node_t * temp,
+ ib_portid_t * path, int dist)
{
ibnd_node_t *node;
@@ -442,7 +454,7 @@ static ibnd_node_t *create_node(ibnd_fabric_t * fabric,
fabric->nodes = (ibnd_node_t *) node;
add_to_type_list(node, fabric);
- add_to_nodedist(node, fabric);
+ add_to_nodedist(node, scan_ctx);
return node;
}
@@ -501,9 +513,10 @@ static void link_ports(ibnd_node_t * node, ibnd_port_t * port,
remoteport->remoteport = (ibnd_port_t *) port;
}
-static int get_remote_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
- ibnd_node_t * node, ibnd_port_t * port,
- ib_portid_t * path, int portnum, int dist)
+static int get_remote_node(ibnd_ctx_t * ctx, struct ibnd_scan_ctx *scan_ctx,
+ ibnd_fabric_t * fabric, ibnd_node_t * node,
+ ibnd_port_t * port, ib_portid_t * path,
+ int portnum, int dist)
{
int rc = 0;
struct ibmad_port *ibmad_port = ctx->ibmad_port;
@@ -522,7 +535,7 @@ static int get_remote_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
!= IB_PORT_PHYS_STATE_LINKUP)
return 1; /* positive == non-fatal error */
- if (extend_dpath(ibmad_port, fabric, path, portnum) < 0)
+ if (extend_dpath(scan_ctx, ibmad_port, fabric, path, portnum) < 0)
return -1;
if (query_node(ibmad_port, fabric, &node_buf, &port_buf, path)) {
@@ -535,7 +548,9 @@ static int get_remote_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
oldnode = find_existing_node(fabric, &node_buf);
if (oldnode)
remotenode = oldnode;
- else if (!(remotenode = create_node(fabric, &node_buf, path, dist + 1))) {
+ else if (!
+ (remotenode =
+ create_node(scan_ctx, fabric, &node_buf, path, dist + 1))) {
rc = -1;
goto error;
}
@@ -575,10 +590,13 @@ ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
int dist = 0;
ib_portid_t *path;
int max_hops = MAXHOPS - 1; /* default find everything */
+ struct ibnd_scan_ctx scan_ctx;
if (check_ctx(ctx) < 0)
return (NULL);
+ memset(&scan_ctx, 0, sizeof scan_ctx);
+
/* if not everything how much? */
if (hops >= 0) {
max_hops = hops;
@@ -607,7 +625,7 @@ ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
goto error;
}
- node = create_node(fabric, &node_buf, from, 0);
+ node = create_node(&scan_ctx, fabric, &node_buf, from, 0);
if (!node)
goto error;
@@ -617,7 +635,7 @@ ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
if (!port)
goto error;
- rc = get_remote_node(ctx, fabric, node, port, from,
+ rc = get_remote_node(ctx, &scan_ctx, fabric, node, port, from,
mad_get_field(node->info, 0,
IB_NODE_LOCAL_PORT_F), 0);
if (rc < 0)
@@ -627,7 +645,7 @@ ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
for (dist = 0; dist <= max_hops; dist++) {
- for (node = fabric->nodesdist[dist]; node; node = node->dnext) {
+ for (node = scan_ctx.nodesdist[dist]; node; node = node->dnext) {
path = &node->path_portid;
@@ -664,14 +682,15 @@ ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
IB_NODE_PORT_GUID_F);
}
- if (get_remote_node(ctx, fabric, node,
- port, path, i, dist) < 0)
+ if (get_remote_node
+ (ctx, &scan_ctx, fabric, node, port, path,
+ i, dist) < 0)
goto error;
}
}
}
- if (group_nodes(fabric))
+ if (group_nodes(&scan_ctx, fabric))
goto error;
return ((ibnd_fabric_t *) fabric);
@@ -693,7 +712,6 @@ static void destroy_node(ibnd_node_t * node)
void ibnd_destroy_fabric(ibnd_fabric_t * fabric)
{
- int dist = 0;
ibnd_node_t *node = NULL;
ibnd_node_t *next = NULL;
ibnd_chassis_t *ch, *ch_next;
@@ -701,19 +719,17 @@ void ibnd_destroy_fabric(ibnd_fabric_t * fabric)
if (!fabric)
return;
- ch = fabric->first_chassis;
+ ch = fabric->chassis;
while (ch) {
ch_next = ch->next;
free(ch);
ch = ch_next;
}
- for (dist = 0; dist <= MAXHOPS; dist++) {
- node = fabric->nodesdist[dist];
- while (node) {
- next = node->dnext;
- destroy_node(node);
- node = next;
- }
+ node = fabric->nodes;
+ while (node) {
+ next = node->next;
+ destroy_node(node);
+ node = next;
}
free(fabric);
}
diff --git a/infiniband-diags/libibnetdisc/src/internal.h b/infiniband-diags/libibnetdisc/src/internal.h
index 8753eae..cf0b4bc 100644
--- a/infiniband-diags/libibnetdisc/src/internal.h
+++ b/infiniband-diags/libibnetdisc/src/internal.h
@@ -47,6 +47,19 @@
#define IBND_ERROR(fmt, ...) \
fprintf(stderr, "%s:%u; " fmt, __FILE__, __LINE__, ## __VA_ARGS__)
+#define MAXHOPS 63
+
+struct ibnd_chassis_ctx {
+ ibnd_chassis_t *first_chassis;
+ ibnd_chassis_t *current_chassis;
+ ibnd_chassis_t *last_chassis;
+};
+
+struct ibnd_scan_ctx {
+ ibnd_node_t *nodesdist[MAXHOPS + 1];
+ ib_portid_t selfportid;
+};
+
struct ibnd_ctx {
struct ibmad_port *ibmad_port;
int show_progress;
--
1.5.4.5
More information about the general
mailing list