[infiniband-diags] [4/4] support --filterdownports in iblinkinfo [REPOST]

2010-07-14 Thread Albert Chu
Hi Sasha,

This patch supports a new option called --filterdownports.  The option
will remove downports from the output if they were previously listed as
down in a cache.

This option is useful for clusters that have unpopulated switch ports.
Many system administrators look for the word Down in the iblinkinfo
output, however, that ability is limited when so many of the ports are
down all the time b/c of unpopulated ports.  This option attempts to
remove that limitation for clusters with unpopulated ports.

Al

-- 
Albert Chu
ch...@llnl.gov
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory
---BeginMessage---

Signed-off-by: Albert Chu ch...@llnl.gov
---
 infiniband-diags/man/iblinkinfo.8 |9 
 infiniband-diags/src/iblinkinfo.c |   40 +
 2 files changed, 49 insertions(+), 0 deletions(-)

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 filename
+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 ae7bbf3..80837ec 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, key(s),
 specify checks to execute for --diff},
+   {filterdownports, 5, 1, file,
+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},
@@ -593,6 +629,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 

[infiniband-diags] [4/4] support --filterdownports in iblinkinfo

2010-04-26 Thread Al Chu
Hi Sasha,

This patch supports a new option called --filterdownports.  The option
will remove downports from the output if they were previously listed as
down in a cache.

This option is useful for clusters that have unpopulated switch ports.
Many system administrators look for the word Down in the iblinkinfo
output, however, that ability is limited when so many of the ports are
down all the time b/c of unpopulated ports.  This option attempts to
remove that limitation for clusters with unpopulated ports.

Al

-- 
Albert Chu
ch...@llnl.gov
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory
---BeginMessage---

Signed-off-by: Albert Chu ch...@llnl.gov
---
 infiniband-diags/man/iblinkinfo.8 |9 
 infiniband-diags/src/iblinkinfo.c |   40 +
 2 files changed, 49 insertions(+), 0 deletions(-)

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 filename
+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, key(s),
 specify checks to execute for --diff},
+   {filterdownports, 5, 1, file,
+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