From: Ira Weiny <wei...@hera2.llnl.gov> Date: Thu, 6 May 2010 13:49:55 -0700 Subject: [PATCH] ibqueryerrors.c: Optimize by querying AllPortSelect first
If errors are seen with AllPortSelect query individual ports for more details. Signed-off-by: Ira Weiny <wei...@llnl.gov> --- infiniband-diags/src/ibqueryerrors.c | 55 +++++++++++++++++++++++---------- 1 files changed, 38 insertions(+), 17 deletions(-) diff --git a/infiniband-diags/src/ibqueryerrors.c b/infiniband-diags/src/ibqueryerrors.c index f04e47f..e0b1c0b 100644 --- a/infiniband-diags/src/ibqueryerrors.c +++ b/infiniband-diags/src/ibqueryerrors.c @@ -245,9 +245,9 @@ static int query_and_dump(char *buf, size_t size, ib_portid_t * portid, return n; } -static void print_results(ib_portid_t * portid, char *node_name, - ibnd_node_t * node, uint8_t * pc, int portnum, - int *header_printed) +static int print_results(ib_portid_t * portid, char *node_name, + ibnd_node_t * node, uint8_t * pc, int portnum, + int *header_printed) { char buf[1024]; char *str = buf; @@ -311,11 +311,16 @@ static void print_results(ib_portid_t * portid, char *node_name, *header_printed = 1; } - printf(" GUID 0x%" PRIx64 " port %d:%s\n", node->guid, - portnum, str); - if (port_config) + if (portnum == 0xFF) + printf(" GUID 0x%" PRIx64 " port ALL:%s\n", + node->guid, str); + else + printf(" GUID 0x%" PRIx64 " port %d:%s\n", + node->guid, portnum, str); + if (portnum != 0xFF && port_config) print_port_config(node_name, node, portnum); } + return (n); } static int query_cap_mask(ib_portid_t * portid, char *node_name, int portnum, @@ -339,8 +344,8 @@ static int query_cap_mask(ib_portid_t * portid, char *node_name, int portnum, return 0; } -static void print_port(ib_portid_t * portid, uint16_t cap_mask, char *node_name, - ibnd_node_t * node, int portnum, int *header_printed) +static int print_port(ib_portid_t * portid, uint16_t cap_mask, char *node_name, + ibnd_node_t * node, int portnum, int *header_printed) { uint8_t pc[1024]; @@ -350,14 +355,15 @@ static void print_port(ib_portid_t * portid, uint16_t cap_mask, char *node_name, IB_GSI_PORT_COUNTERS, ibmad_port)) { IBWARN("IB_GSI_PORT_COUNTERS query failed on %s, %s port %d", node_name, portid2str(portid), portnum); - return; + return (0); } if (!(cap_mask & 0x1000)) { /* if PortCounters:PortXmitWait not supported clear this counter */ uint32_t foo = 0; mad_encode_field(pc, IB_PC_XMT_WAIT_F, &foo); } - print_results(portid, node_name, node, pc, portnum, header_printed); + return (print_results(portid, node_name, node, pc, portnum, + header_printed)); } static void clear_port(ib_portid_t * portid, uint16_t cap_mask, @@ -425,6 +431,27 @@ void print_node(ibnd_node_t * node, void *user_data) node_name = remap_node_name(node_name_map, node->guid, node->nodedesc); + if (node->type == IB_NODE_SWITCH) { + ib_portid_set(&portid, node->smalid, 0, 0); + p = 0; + } else { + for (p = 1; p <= node->numports; p++) { + if (node->ports[p]) { + ib_portid_set(&portid, + node->ports[p]->base_lid, + 0, 0); + break; + } + } + } + if ((query_cap_mask(&portid, node_name, p, &cap_mask) == 0) && + (cap_mask & 0x100)) { + all_port_sup = 1; + if (!print_port(&portid, cap_mask, node_name, node, + 0xFF, &header_printed)) + goto clear; + } + for (p = startport; p <= node->numports; p++) { if (node->ports[p]) { if (node->type == IB_NODE_SWITCH) @@ -433,13 +460,6 @@ void print_node(ibnd_node_t * node, void *user_data) ib_portid_set(&portid, node->ports[p]->base_lid, 0, 0); - if (query_cap_mask(&portid, node_name, p, &cap_mask) < - 0) - continue; - - if (cap_mask & 0x100) - all_port_sup = 1; - print_port(&portid, cap_mask, node_name, node, p, &header_printed); if (!all_port_sup) @@ -447,6 +467,7 @@ void print_node(ibnd_node_t * node, void *user_data) } } +clear: if (all_port_sup) clear_port(&portid, cap_mask, node_name, 0xFF); -- 1.5.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html