From: Ira Weiny <[email protected]>
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 <[email protected]>
---
 .../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

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to