From patchwork Mon Apr 26 21:39:43 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Al Chu X-Patchwork-Id: 95210 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o3QLdfM6004799 for ; Mon, 26 Apr 2010 21:39:48 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755273Ab0DZVjo (ORCPT ); Mon, 26 Apr 2010 17:39:44 -0400 Received: from nspiron-3.llnl.gov ([128.115.41.83]:20330 "EHLO smtp.llnl.gov" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754468Ab0DZVjo (ORCPT ); Mon, 26 Apr 2010 17:39:44 -0400 X-Attachments: 0004-support-filterdownports-in-iblinkinfo.patch Received: from auk31.llnl.gov (HELO [134.9.93.159]) ([134.9.93.159]) by smtp.llnl.gov with ESMTP; 26 Apr 2010 14:39:43 -0700 Subject: [infiniband-diags] [4/4] support --filterdownports in iblinkinfo From: Al Chu To: Sasha Khapyorsky Cc: "linux-rdma@vger.kernel.org" Date: Mon, 26 Apr 2010 14:39:43 -0700 Message-Id: <1272317983.29737.50.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 X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 26 Apr 2010 21:39:48 +0000 (UTC) diff --git a/infiniband-diags/man/iblinkinfo.8 b/infiniband-diags/man/iblinkinfo.8 index 65ea919..940d008 100644 --- a/infiniband-diags/man/iblinkinfo.8 +++ b/infiniband-diags/man/iblinkinfo.8 @@ -66,6 +66,15 @@ Comma separate multiple diff check key(s). The available diff checks are:\fIport\fR = port connections, \fIstate\fR = port state, \fIlid\fR = lids, \fInodedesc\fR = node descriptions. If \fIport\fR is specified alongside \fIlid\fR or \fInodedesc\fR, remote port lids and node descriptions will also be compared. +.TP +\fB\-\-filterdownports\fR +Filter downports indicated in a ibnetdiscover cache. If a port was previously +indicated as down in the specified cache, and is still down, do not output it in the +resulting output. This option may be particularly useful for environments +where switches are not fully populated, thus much of the default iblinkinfo +info is considered unuseful. See +.B ibnetdiscover +for information on caching ibnetdiscover output. .SH AUTHOR .TP diff --git a/infiniband-diags/src/iblinkinfo.c b/infiniband-diags/src/iblinkinfo.c index 19adc20..4b8616e 100644 --- a/infiniband-diags/src/iblinkinfo.c +++ b/infiniband-diags/src/iblinkinfo.c @@ -65,6 +65,8 @@ static nn_map_t *node_name_map = NULL; static char *load_cache_file = NULL; static char *diff_cache_file = NULL; static unsigned diffcheck_flags = DIFF_FLAG_DEFAULT; +static char *filterdownports_cache_file = NULL; +static ibnd_fabric_t *filterdownports_fabric = NULL; static uint64_t guid = 0; static char *guid_str = NULL; @@ -116,6 +118,30 @@ void get_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * port) buf, 64, &max_speed)); } +int filterdownport_check(ibnd_node_t * node, ibnd_port_t * port) +{ + ibnd_node_t *fsw; + ibnd_port_t *fport; + int fistate; + + fsw = ibnd_find_node_guid(filterdownports_fabric, node->guid); + + if (!fsw) + return 0; + + if (port->portnum > fsw->numports) + return 0; + + fport = fsw->ports[port->portnum]; + + if (!fport) + return 0; + + fistate = mad_get_field(fport->info, 0, IB_PORT_STATE_F); + + return (fistate == IB_LINK_DOWN) ? 1 : 0; +} + void print_port(ibnd_node_t * node, ibnd_port_t * port, char *out_prefix) { char width[64], speed[64], state[64], physstate[64]; @@ -142,6 +168,11 @@ void print_port(ibnd_node_t * node, ibnd_port_t * port, char *out_prefix) width_msg[0] = '\0'; speed_msg[0] = '\0'; + if (istate == IB_LINK_DOWN + && filterdownports_fabric + && filterdownport_check(node,port)) + return; + /* C14-24.2.1 states that a down port allows for invalid data to be * returned for all PortInfo components except PortState and * PortPhysicalState */ @@ -467,6 +498,9 @@ static int process_opt(void *context, int ch, char *optarg) p = strtok(NULL, ","); } break; + case 5: + filterdownports_cache_file = strdup(optarg); + break; case 'S': guid_str = optarg; guid = (uint64_t) strtoull(guid_str, 0, 0); @@ -539,6 +573,8 @@ int main(int argc, char **argv) "filename of ibnetdiscover cache to diff"}, {"diffcheck", 4, 1, "", "specify checks to execute for --diff"}, + {"filterdownports", 5, 1, "", + "filename of ibnetdiscover cache to filter downports"}, {"outstanding_smps", 'o', 1, NULL, "specify the number of outstanding SMP's which should be " "issued during the scan"}, @@ -591,6 +627,10 @@ int main(int argc, char **argv) !(diff_fabric = ibnd_load_fabric(diff_cache_file, 0))) IBERROR("loading cached fabric for diff failed\n"); + if (filterdownports_cache_file && + !(filterdownports_fabric = ibnd_load_fabric(filterdownports_cache_file, 0))) + IBERROR("loading cached fabric for filterdownports failed\n"); + if (load_cache_file) { if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == NULL) { fprintf(stderr, "loading cached fabric failed\n");