Split out public parameters from ibnd_fabric_t that are useless b/c they are only used during the ibnetdiscover scan.
Note that this patch has similarities to a previous patch from Ira, however it is separate and independent of that patch series. Al -- Albert Chu ch...@llnl.gov Computer Scientist High Performance Systems Division Lawrence Livermore National Laboratory
From: Albert Chu <ch...@llnl.gov> Date: Tue, 27 Oct 2009 16:16:14 -0700 Subject: [PATCH] split out ibnd_fabric_t fields that are only used during a scan Signed-off-by: Albert Chu <ch...@llnl.gov> --- .../libibnetdisc/include/infiniband/ibnetdisc.h | 6 -- infiniband-diags/libibnetdisc/src/chassis.c | 68 ++++++++++++-------- infiniband-diags/libibnetdisc/src/chassis.h | 2 +- infiniband-diags/libibnetdisc/src/ibnetdisc.c | 60 +++++++++-------- infiniband-diags/libibnetdisc/src/internal.h | 10 +++ 5 files changed, 83 insertions(+), 63 deletions(-) diff --git a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h index c55ce00..8303175 100644 --- a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h +++ b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h @@ -124,7 +124,6 @@ typedef struct ibnd_chassis { } ibnd_chassis_t; #define HTSZ 137 -#define MAXHOPS 63 /** ========================================================================= * Fabric @@ -145,14 +144,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..5043f42 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; } @@ -214,7 +214,7 @@ static ibnd_chassis_t *find_chassisguid(ibnd_fabric_t * fabric, uint64_t chguid; chguid = get_chassisguid(node); - for (current = fabric->first_chassis; current; current = current->next) { + for (current = fabric->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(ibnd_scan_t *ibnd_scan) { - if (!(fabric->current_chassis = calloc(1, sizeof(ibnd_chassis_t)))) { + if (!(ibnd_scan->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 (ibnd_scan->first_chassis == NULL) { + ibnd_scan->first_chassis = ibnd_scan->current_chassis; + ibnd_scan->last_chassis = ibnd_scan->current_chassis; } else { - fabric->last_chassis->next = fabric->current_chassis; - fabric->last_chassis = fabric->current_chassis; + ibnd_scan->last_chassis->next = ibnd_scan->current_chassis; + ibnd_scan->last_chassis = ibnd_scan->current_chassis; } return (0); } @@ -818,33 +818,35 @@ 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(ibnd_fabric_t * fabric, ibnd_scan_t *ibnd_scan) { ibnd_node_t *node; int dist; int chassisnum = 0; ibnd_chassis_t *chassis; + ibnd_chassis_t *ch, *ch_next; - fabric->first_chassis = NULL; - fabric->current_chassis = NULL; + ibnd_scan->first_chassis = NULL; + ibnd_scan->current_chassis = NULL; + ibnd_scan->last_chassis = NULL; /* 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 = ibnd_scan->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)) - return (-1); + goto cleanup; } } /* 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 = ibnd_scan->nodesdist[dist]; node; node = node->dnext) { if (mad_get_field(node->info, 0, IB_NODE_VENDORID_F) != VTR_VENDOR_ID) continue; @@ -852,18 +854,18 @@ int group_nodes(ibnd_fabric_t * fabric) || (node->chassis && node->chassis->chassisnum) || !is_spine(node)) continue; - if (add_chassis(fabric)) - return (-1); - fabric->current_chassis->chassisnum = ++chassisnum; - if (build_chassis(node, fabric->current_chassis)) - return (-1); + if (add_chassis(ibnd_scan)) + goto cleanup; + ibnd_scan->current_chassis->chassisnum = ++chassisnum; + if (build_chassis(node, ibnd_scan->current_chassis)) + goto cleanup; } } /* 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 = ibnd_scan->nodesdist[dist]; node; node = node->dnext) { if (mad_get_field(node->info, 0, IB_NODE_VENDORID_F) == VTR_VENDOR_ID) continue; @@ -876,12 +878,12 @@ int group_nodes(ibnd_fabric_t * fabric) chassis->nodecount++; else { /* Possible new chassis */ - if (add_chassis(fabric)) - return (-1); - fabric->current_chassis->chassisguid = + if (add_chassis(ibnd_scan)) + goto cleanup; + ibnd_scan->current_chassis->chassisguid = get_chassisguid((ibnd_node_t *) node); - fabric->current_chassis->nodecount = 1; + ibnd_scan->current_chassis->nodecount = 1; } } } @@ -890,7 +892,7 @@ 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 = ibnd_scan->nodesdist[dist]; node; node = node->dnext) { if (mad_get_field(node->info, 0, IB_NODE_VENDORID_F) == VTR_VENDOR_ID) continue; @@ -918,6 +920,18 @@ int group_nodes(ibnd_fabric_t * fabric) dist++; } - fabric->chassis = fabric->first_chassis; + fabric->chassis = ibnd_scan->first_chassis; return (0); + +cleanup: + ch = ibnd_scan->first_chassis; + while (ch) { + ch_next = ch->next; + free(ch); + ch = ch_next; + } + ibnd_scan->first_chassis = NULL; + ibnd_scan->current_chassis = NULL; + ibnd_scan->last_chassis = NULL; + return (-1); } diff --git a/infiniband-diags/libibnetdisc/src/chassis.h b/infiniband-diags/libibnetdisc/src/chassis.h index 2191046..7a96b02 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_fabric *fabric, ibnd_scan_t *ibnd_scan); #endif /* _CHASSIS_H_ */ diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c b/infiniband-diags/libibnetdisc/src/ibnetdisc.c index 99e44bd..b25c3d0 100644 --- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c +++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c @@ -180,20 +180,20 @@ static void retract_dpath(ib_portid_t * path) } static int extend_dpath(struct ibmad_port *ibmad_port, ibnd_fabric_t * fabric, - ib_portid_t * portid, int nextport) + ibnd_scan_t *ibnd_scan, ib_portid_t * portid, int nextport) { int rc = 0; if (portid->lid) { /* 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, + if (!ibnd_scan->selfportid.lid) + if (ib_resolve_self_via(&ibnd_scan->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) ibnd_scan->selfportid.lid; portid->drpath.drdlid = 0xFFFF; } @@ -387,17 +387,17 @@ 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, ibnd_scan_t * ibnd_scan) { int dist = node->dist; if (node->type != IB_NODE_SWITCH) dist = MAXHOPS; /* special Ca list */ - node->dnext = fabric->nodesdist[dist]; - fabric->nodesdist[dist] = node; + node->dnext = ibnd_scan->nodesdist[dist]; + ibnd_scan->nodesdist[dist] = node; } -static ibnd_node_t *create_node(ibnd_fabric_t * fabric, +static ibnd_node_t *create_node(ibnd_fabric_t * fabric, ibnd_scan_t * ibnd_scan, ibnd_node_t * temp, ib_portid_t * path, int dist) { @@ -420,7 +420,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, ibnd_scan); return node; } @@ -480,9 +480,9 @@ static void link_ports(ibnd_node_t * node, ibnd_port_t * port, } static int get_remote_node(struct ibmad_port *ibmad_port, - ibnd_fabric_t * fabric, ibnd_node_t * node, - ibnd_port_t * port, ib_portid_t * path, - int portnum, int dist) + ibnd_fabric_t * fabric, ibnd_scan_t * ibnd_scan, + ibnd_node_t * node, ibnd_port_t * port, + ib_portid_t * path, int portnum, int dist) { int rc = 0; ibnd_node_t node_buf; @@ -500,7 +500,8 @@ static int get_remote_node(struct ibmad_port *ibmad_port, != IB_PORT_PHYS_STATE_LINKUP) return 1; /* positive == non-fatal error */ - if (portnum > 0 && extend_dpath(ibmad_port, fabric, path, portnum) < 0) + if (portnum > 0 && extend_dpath(ibmad_port, fabric, ibnd_scan, + path, portnum) < 0) return -1; if (query_node(ibmad_port, fabric, &node_buf, &port_buf, path)) { @@ -513,7 +514,8 @@ static int get_remote_node(struct ibmad_port *ibmad_port, 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(fabric, ibnd_scan, &node_buf, + path, dist + 1))) { rc = -1; goto error; } @@ -552,6 +554,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, int dist = 0; ib_portid_t *path; int max_hops = MAXHOPS - 1; /* default find everything */ + ibnd_scan_t ibnd_scan; if (_check_ibmad_port(ibmad_port) < 0) return (NULL); @@ -574,6 +577,8 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, memset(fabric, 0, sizeof(*fabric)); + memset(&ibnd_scan, '\0', sizeof(ibnd_scan_t)); + IBND_DEBUG("from %s\n", portid2str(from)); memset(&node_buf, 0, sizeof(node_buf)); @@ -584,7 +589,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, goto error; } - node = create_node(fabric, &node_buf, from, 0); + node = create_node(fabric, &ibnd_scan, &node_buf, from, 0); if (!node) goto error; @@ -594,7 +599,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, if (!port) goto error; - rc = get_remote_node(ibmad_port, fabric, node, port, from, + rc = get_remote_node(ibmad_port, fabric, &ibnd_scan, node, port, from, mad_get_field(node->info, 0, IB_NODE_LOCAL_PORT_F), 0); if (rc < 0) @@ -604,7 +609,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, for (dist = 0; dist <= max_hops; dist++) { - for (node = fabric->nodesdist[dist]; node; node = node->dnext) { + for (node = ibnd_scan.nodesdist[dist]; node; node = node->dnext) { path = &node->path_portid; @@ -640,14 +645,14 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port, IB_NODE_PORT_GUID_F); } - if (get_remote_node(ibmad_port, fabric, node, - port, path, i, dist) < 0) + if (get_remote_node(ibmad_port, fabric, &ibnd_scan, + node, port, path, i, dist) < 0) goto error; } } } - if (group_nodes(fabric)) + if (group_nodes(fabric, &ibnd_scan)) goto error; return ((ibnd_fabric_t *) fabric); @@ -669,7 +674,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; @@ -677,19 +681,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 21ff476..eac1a29 100644 --- a/infiniband-diags/libibnetdisc/src/internal.h +++ b/infiniband-diags/libibnetdisc/src/internal.h @@ -50,4 +50,14 @@ /* HASH table defines */ #define HASHGUID(guid) ((uint32_t)(((uint32_t)(guid) * 101) ^ ((uint32_t)((guid) >> 32) * 103))) +#define MAXHOPS 63 + +typedef struct ibnd_scan { + ibnd_node_t *nodesdist[MAXHOPS + 1]; + ibnd_chassis_t *first_chassis; + ibnd_chassis_t *current_chassis; + ibnd_chassis_t *last_chassis; + ib_portid_t selfportid; +} ibnd_scan_t; + #endif /* _INTERNAL_H_ */ -- 1.5.4.5