From patchwork Tue Nov 17 18:17:20 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Al Chu X-Patchwork-Id: 60763 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id nAHIHM7o024387 for ; Tue, 17 Nov 2009 18:17:22 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750905AbZKQSRP (ORCPT ); Tue, 17 Nov 2009 13:17:15 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752736AbZKQSRP (ORCPT ); Tue, 17 Nov 2009 13:17:15 -0500 Received: from nspiron-3.llnl.gov ([128.115.41.83]:63892 "EHLO smtp.llnl.gov" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754159AbZKQSRO (ORCPT ); Tue, 17 Nov 2009 13:17:14 -0500 X-Attachments: 0002-use-nodes-switches-lists-instead-of-nodesdist-array.patch Received: from auk31.llnl.gov (HELO [134.9.93.159]) ([134.9.93.159]) by smtp.llnl.gov with ESMTP; 17 Nov 2009 10:17:20 -0800 Subject: [infiniband-diags] [PATCH] [2/3] use nodes/switches lists instead of nodesdist array in libibnetdiscover From: Al Chu Reply-To: chu11@llnl.gov To: sashak@voltaire.com Cc: linux-rdma@vger.kernel.org Date: Tue, 17 Nov 2009 10:17:20 -0800 Message-Id: <1258481840.1335.96.camel@auk31.llnl.gov> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org diff --git a/infiniband-diags/libibnetdisc/src/chassis.c b/infiniband-diags/libibnetdisc/src/chassis.c index a8b6767..c11fa8d 100644 --- a/infiniband-diags/libibnetdisc/src/chassis.c +++ b/infiniband-diags/libibnetdisc/src/chassis.c @@ -816,11 +816,9 @@ static void add_node_to_chassis(ibnd_chassis_t * chassis, ibnd_node_t * node) int group_nodes(ibnd_fabric_t * fabric, ibnd_scan_t *scan) { ibnd_node_t *node; - int dist; int chassisnum = 0; ibnd_chassis_t *chassis; ibnd_chassis_t *ch, *ch_next; - ibnd_node_scan_t *node_scan; scan->first_chassis = NULL; scan->current_chassis = NULL; @@ -830,91 +828,71 @@ int group_nodes(ibnd_fabric_t * fabric, ibnd_scan_t *scan) /* 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_scan = scan->nodesdist[dist]; node_scan; node_scan = node_scan->dnext) { - node = node_scan->node; - - if (mad_get_field(node->info, 0, - IB_NODE_VENDORID_F) == VTR_VENDOR_ID - && fill_voltaire_chassis_record(node)) - goto cleanup; - } + for (node = fabric->switches; node; node = node->type_next) { + if (mad_get_field(node->info, 0, + IB_NODE_VENDORID_F) == VTR_VENDOR_ID + && fill_voltaire_chassis_record(node)) + 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_scan = scan->nodesdist[dist]; node_scan; node_scan = node_scan->dnext) { - node = node_scan->node; - - if (mad_get_field(node->info, 0, - IB_NODE_VENDORID_F) != VTR_VENDOR_ID) - continue; - if (!node->ch_found - || (node->chassis && node->chassis->chassisnum) - || !is_spine(node)) - continue; - if (add_chassis(scan)) - goto cleanup; - scan->current_chassis->chassisnum = ++chassisnum; - if (build_chassis(node, scan->current_chassis)) - goto cleanup; - } + for (node = fabric->switches; node; node = node->type_next) { + if (mad_get_field(node->info, 0, + IB_NODE_VENDORID_F) != VTR_VENDOR_ID) + continue; + if (!node->ch_found + || (node->chassis && node->chassis->chassisnum) + || !is_spine(node)) + continue; + if (add_chassis(scan)) + goto cleanup; + scan->current_chassis->chassisnum = ++chassisnum; + if (build_chassis(node, 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_scan = scan->nodesdist[dist]; node_scan; node_scan = node_scan->dnext) { - node = node_scan->node; - - 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, node); - if (chassis) - chassis->nodecount++; - else { - /* Possible new chassis */ - if (add_chassis(scan)) - goto cleanup; - scan->current_chassis->chassisguid = - get_chassisguid(node); - scan->current_chassis->nodecount = 1; - } + for (node = fabric->switches; node; node = node->type_next) { + 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, node); + if (chassis) + chassis->nodecount++; + else { + /* Possible new chassis */ + if (add_chassis(scan)) + goto cleanup; + scan->current_chassis->chassisguid = + get_chassisguid(node); + scan->current_chassis->nodecount = 1; } } + } /* now, make another pass to see which nodes are part of chassis */ /* (defined as chassis->nodecount > 1) */ - for (dist = 0; dist <= MAXHOPS;) { - for (node_scan = scan->nodesdist[dist]; node_scan; node_scan = node_scan->dnext) { - node = node_scan->node; - - 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, node); - if (chassis && chassis->nodecount > 1) { - if (!chassis->chassisnum) - chassis->chassisnum = - ++chassisnum; - if (!node->ch_found) { - node->ch_found = 1; - add_node_to_chassis(chassis, - node); - } + for (node = fabric->nodes; node; node = node->next) { + 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, node); + if (chassis && chassis->nodecount > 1) { + if (!chassis->chassisnum) + chassis->chassisnum = + ++chassisnum; + if (!node->ch_found) { + node->ch_found = 1; + add_node_to_chassis(chassis, node); } } } - if (dist == fabric->maxhops_discovered) - dist = MAXHOPS; /* skip to CAs */ - else - dist++; } fabric->chassis = scan->first_chassis;