public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 05/5] infiniband-diags: ibqueryerrors; add --counters option
@ 2011-04-28  1:47 Ira Weiny
       [not found] ` <20110427184700.f2a561c6.weiny2-i2BcT+NCU+M@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Ira Weiny @ 2011-04-28  1:47 UTC (permalink / raw)
  To: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org


From: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
Date: Wed, 27 Apr 2011 01:07:59 -0700
Subject: [PATCH 05/5] infiniband-diags: ibqueryerrors; add --counters option

Display the data counters (optionally extended data counters) for all ports in the fabric.

Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
---
 src/ibqueryerrors.c |  139 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 110 insertions(+), 29 deletions(-)

diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c
index a7556cf..26ff72b 100644
--- a/src/ibqueryerrors.c
+++ b/src/ibqueryerrors.c
@@ -62,6 +62,7 @@ static nn_map_t *node_name_map = NULL;
 static char *load_cache_file = NULL;
 
 int data_counters = 0;
+int data_counters_only = 0;
 int port_config = 0;
 uint64_t node_guid = 0;
 char *node_guid_str = NULL;
@@ -452,8 +453,65 @@ static int query_cap_mask(ib_portid_t * portid, char *node_name, int portnum,
 	return 0;
 }
 
-static int 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_data_cnts(ib_portid_t * portid, uint16_t cap_mask,
+			   char *node_name, ibnd_node_t * node, int portnum,
+			   int *header_printed)
+{
+	uint8_t pc[1024];
+	int i;
+	int start_field = IB_PC_XMT_BYTES_F;
+	int end_field = IB_PC_RCV_PKTS_F;
+
+	memset(pc, 0, 1024);
+
+	if (cap_mask & (IB_PM_EXT_WIDTH_SUPPORTED | IB_PM_EXT_WIDTH_NOIETF_SUP)) {
+		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
+				   IB_GSI_PORT_COUNTERS_EXT, ibmad_port)) {
+			IBWARN("IB_GSI_PORT_COUNTERS_EXT query failed on %s, %s port %d",
+			       node_name, portid2str(portid), portnum);
+			return (1);
+		}
+		start_field = IB_PC_EXT_XMT_BYTES_F;
+		end_field = IB_PC_EXT_RCV_MPKTS_F;
+	} else {
+		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
+				   IB_GSI_PORT_COUNTERS, ibmad_port)) {
+			IBWARN("IB_GSI_PORT_COUNTERS query failed on %s, %s port %d",
+			       node_name, portid2str(portid), portnum);
+			return (1);
+		}
+		start_field = IB_PC_XMT_BYTES_F;
+		end_field = IB_PC_RCV_PKTS_F;
+	}
+
+	if (!*header_printed) {
+		printf("Data Counters for 0x%" PRIx64 " \"%s\"\n", node->guid,
+		       node_name);
+		*header_printed = 1;
+	}
+
+	if (portnum == 0xFF)
+		printf("   GUID 0x%" PRIx64 " port ALL:", node->guid);
+	else
+		printf("   GUID 0x%" PRIx64 " port %d:",
+		       node->guid, portnum);
+
+	for (i = start_field; i <= end_field; i++) {
+		uint64_t val64 = 0;
+		mad_decode_field(pc, i, (void *)&val64);
+		printf(" [%s == %" PRIu64 "]", mad_field_name(i), val64);
+	}
+	printf("\n");
+
+	if (portnum != 0xFF && port_config)
+		print_port_config(node_name, node, portnum);
+
+	return (0);
+}
+
+static int print_errors(ib_portid_t * portid, uint16_t cap_mask,
+			char *node_name, ibnd_node_t * node, int portnum,
+			int *header_printed)
 {
 	uint8_t pc[1024];
 	uint8_t pce[1024];
@@ -535,9 +593,6 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
 	 */
 	uint32_t mask = 0;
 
-	if (!clear_errors && !clear_counts)
-		return;
-
 	if (clear_errors) {
 		mask |= 0xFFF;
 		if (cap_mask & IB_PM_PC_XMIT_WAIT_SUP)
@@ -546,11 +601,13 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
 	if (clear_counts)
 		mask |= 0xF000;
 
-	if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-				   IB_GSI_PORT_COUNTERS, ibmad_port))
-		IBERROR("Failed to reset errors %s port %d", node_name, port);
+	if (mask)
+		if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
+					   IB_GSI_PORT_COUNTERS, ibmad_port))
+			IBERROR("Failed to reset errors %s port %d", node_name,
+				port);
 
-	if (details && clear_errors) {
+	if (clear_errors && details) {
 		memset(pc, 0, 1024);
 		performance_reset_via(pc, portid, port, 0xf, ibd_timeout,
 				      IB_GSI_PORT_XMIT_DISCARD_DETAILS,
@@ -617,29 +674,49 @@ void print_node(ibnd_node_t * node, void *user_data)
 			}
 		}
 	}
+
 	if ((query_cap_mask(&portid, node_name, p, &cap_mask) == 0) &&
-	    (cap_mask & IB_PM_ALL_PORT_SELECT)) {
+	    (cap_mask & IB_PM_ALL_PORT_SELECT))
 		all_port_sup = 1;
-		if (!print_port(&portid, cap_mask, node_name, node,
-				0xFF, &header_printed)) {
-			summary.ports_checked += node->numports;
-			goto clear;
-		}
-	}
 
-	for (p = startport; p <= node->numports; p++) {
-		if (node->ports[p]) {
-			if (node->type == IB_NODE_SWITCH)
-				ib_portid_set(&portid, node->smalid, 0, 0);
-			else
-				ib_portid_set(&portid, node->ports[p]->base_lid,
-					      0, 0);
+	if (data_counters_only) {
+		for (p = startport; p <= node->numports; p++) {
+			if (node->ports[p]) {
+				if (node->type == IB_NODE_SWITCH)
+					ib_portid_set(&portid, node->smalid, 0, 0);
+				else
+					ib_portid_set(&portid, node->ports[p]->base_lid,
+						      0, 0);
+
+				print_data_cnts(&portid, cap_mask, node_name, node, p,
+						&header_printed);
+				summary.ports_checked++;
+				if (!all_port_sup)
+					clear_port(&portid, cap_mask, node_name, p);
+			}
+		}
+	} else {
+		if (all_port_sup)
+			if (!print_errors(&portid, cap_mask, node_name, node,
+					  0xFF, &header_printed)) {
+				summary.ports_checked += node->numports;
+				goto clear;
+			}
 
-			print_port(&portid, cap_mask, node_name, node, p,
-				   &header_printed);
-			summary.ports_checked++;
-			if (!all_port_sup)
-				clear_port(&portid, cap_mask, node_name, p);
+		for (p = startport; p <= node->numports; p++) {
+			if (node->ports[p]) {
+				if (node->type == IB_NODE_SWITCH)
+					ib_portid_set(&portid, node->smalid, 0, 0);
+				else
+					ib_portid_set(&portid, node->ports[p]->base_lid,
+						      0, 0);
+
+				print_errors(&portid, cap_mask, node_name, node, p,
+					     &header_printed);
+				summary.ports_checked++;
+				if (!all_port_sup)
+					clear_port(&portid, cap_mask, node_name, p);
+			}
 		}
 	}
 
@@ -713,6 +790,9 @@ static int process_opt(void *context, int ch, char *optarg)
 	case 8:
 		threshold_file = strdup(optarg);
 		break;
+	case 9:
+		data_counters_only = 1;
+		break;
 	case 'G':
 	case 'S':
 		node_guid_str = optarg;
@@ -771,11 +851,12 @@ int main(int argc, char **argv)
 		 "specify an alternate thresold file, default: " DEF_THRES_FILE},
 		{"GNDN", 'R', 0, NULL,
 		 "(This option is obsolete and does nothing)"},
-		{"data", 2, 0, NULL, "include the data counters in the output"},
+		{"data", 2, 0, NULL, "include data counters for ports with errors"},
 		{"switch", 3, 0, NULL, "print data for switches only"},
 		{"ca", 4, 0, NULL, "print data for CA's only"},
 		{"router", 5, 0, NULL, "print data for routers only"},
 		{"details", 6, 0, NULL, "include transmit discard details"},
+		{"counters", 9, 0, NULL, "print data counters only"},
 		{"clear-errors", 'k', 0, NULL,
 		 "Clear error counters after read"},
 		{"clear-counts", 'K', 0, NULL,
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 05/5] infiniband-diags: ibqueryerrors; add --counters option
       [not found] ` <20110427184700.f2a561c6.weiny2-i2BcT+NCU+M@public.gmane.org>
@ 2011-04-28 14:46   ` Hal Rosenstock
       [not found]     ` <4DB97DBF.20709-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Hal Rosenstock @ 2011-04-28 14:46 UTC (permalink / raw)
  To: Ira Weiny; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org

On 4/27/2011 9:47 PM, Ira Weiny wrote:
> 
> From: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
> Date: Wed, 27 Apr 2011 01:07:59 -0700
> Subject: [PATCH 05/5] infiniband-diags: ibqueryerrors; add --counters option
> 
> Display the data counters (optionally extended data counters) for all ports in the fabric.
> 
> Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
> ---
>  src/ibqueryerrors.c |  139 ++++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 110 insertions(+), 29 deletions(-)
> 
> diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c
> index a7556cf..26ff72b 100644
> --- a/src/ibqueryerrors.c
> +++ b/src/ibqueryerrors.c
> @@ -62,6 +62,7 @@ static nn_map_t *node_name_map = NULL;
>  static char *load_cache_file = NULL;
>  
>  int data_counters = 0;
> +int data_counters_only = 0;
>  int port_config = 0;
>  uint64_t node_guid = 0;
>  char *node_guid_str = NULL;
> @@ -452,8 +453,65 @@ static int query_cap_mask(ib_portid_t * portid, char *node_name, int portnum,
>  	return 0;
>  }
>  
> -static int 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_data_cnts(ib_portid_t * portid, uint16_t cap_mask,
> +			   char *node_name, ibnd_node_t * node, int portnum,
> +			   int *header_printed)
> +{
> +	uint8_t pc[1024];
> +	int i;
> +	int start_field = IB_PC_XMT_BYTES_F;
> +	int end_field = IB_PC_RCV_PKTS_F;
> +
> +	memset(pc, 0, 1024);
> +
> +	if (cap_mask & (IB_PM_EXT_WIDTH_SUPPORTED | IB_PM_EXT_WIDTH_NOIETF_SUP)) {
> +		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
> +				   IB_GSI_PORT_COUNTERS_EXT, ibmad_port)) {
> +			IBWARN("IB_GSI_PORT_COUNTERS_EXT query failed on %s, %s port %d",
> +			       node_name, portid2str(portid), portnum);
> +			return (1);
> +		}
> +		start_field = IB_PC_EXT_XMT_BYTES_F;
> +		end_field = IB_PC_EXT_RCV_MPKTS_F;

Shouldn't end field vary based on whether it's NoIETF or not ? In the
case of NoIETF, it should be IB_PC_EXT_RCV_PKTS_F so something like:

	if (cap_mask & IB_PM_EXT_WIDTH_NOIETF_SUP)
		end_field = IB_PC_EXT_RCV_PKTS_F;
	else
		end_field = IB_PC_EXT_RCV_MPKTS_F;

-- Hal

> +	} else {
> +		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
> +				   IB_GSI_PORT_COUNTERS, ibmad_port)) {
> +			IBWARN("IB_GSI_PORT_COUNTERS query failed on %s, %s port %d",
> +			       node_name, portid2str(portid), portnum);
> +			return (1);
> +		}
> +		start_field = IB_PC_XMT_BYTES_F;
> +		end_field = IB_PC_RCV_PKTS_F;
> +	}
> +
> +	if (!*header_printed) {
> +		printf("Data Counters for 0x%" PRIx64 " \"%s\"\n", node->guid,
> +		       node_name);
> +		*header_printed = 1;
> +	}
> +
> +	if (portnum == 0xFF)
> +		printf("   GUID 0x%" PRIx64 " port ALL:", node->guid);
> +	else
> +		printf("   GUID 0x%" PRIx64 " port %d:",
> +		       node->guid, portnum);
> +
> +	for (i = start_field; i <= end_field; i++) {
> +		uint64_t val64 = 0;
> +		mad_decode_field(pc, i, (void *)&val64);
> +		printf(" [%s == %" PRIu64 "]", mad_field_name(i), val64);
> +	}
> +	printf("\n");
> +
> +	if (portnum != 0xFF && port_config)
> +		print_port_config(node_name, node, portnum);
> +
> +	return (0);
> +}
> +
> +static int print_errors(ib_portid_t * portid, uint16_t cap_mask,
> +			char *node_name, ibnd_node_t * node, int portnum,
> +			int *header_printed)
>  {
>  	uint8_t pc[1024];
>  	uint8_t pce[1024];
> @@ -535,9 +593,6 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
>  	 */
>  	uint32_t mask = 0;
>  
> -	if (!clear_errors && !clear_counts)
> -		return;
> -
>  	if (clear_errors) {
>  		mask |= 0xFFF;
>  		if (cap_mask & IB_PM_PC_XMIT_WAIT_SUP)
> @@ -546,11 +601,13 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
>  	if (clear_counts)
>  		mask |= 0xF000;
>  
> -	if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
> -				   IB_GSI_PORT_COUNTERS, ibmad_port))
> -		IBERROR("Failed to reset errors %s port %d", node_name, port);
> +	if (mask)
> +		if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
> +					   IB_GSI_PORT_COUNTERS, ibmad_port))
> +			IBERROR("Failed to reset errors %s port %d", node_name,
> +				port);
>  
> -	if (details && clear_errors) {
> +	if (clear_errors && details) {
>  		memset(pc, 0, 1024);
>  		performance_reset_via(pc, portid, port, 0xf, ibd_timeout,
>  				      IB_GSI_PORT_XMIT_DISCARD_DETAILS,
> @@ -617,29 +674,49 @@ void print_node(ibnd_node_t * node, void *user_data)
>  			}
>  		}
>  	}
> +
>  	if ((query_cap_mask(&portid, node_name, p, &cap_mask) == 0) &&
> -	    (cap_mask & IB_PM_ALL_PORT_SELECT)) {
> +	    (cap_mask & IB_PM_ALL_PORT_SELECT))
>  		all_port_sup = 1;
> -		if (!print_port(&portid, cap_mask, node_name, node,
> -				0xFF, &header_printed)) {
> -			summary.ports_checked += node->numports;
> -			goto clear;
> -		}
> -	}
>  
> -	for (p = startport; p <= node->numports; p++) {
> -		if (node->ports[p]) {
> -			if (node->type == IB_NODE_SWITCH)
> -				ib_portid_set(&portid, node->smalid, 0, 0);
> -			else
> -				ib_portid_set(&portid, node->ports[p]->base_lid,
> -					      0, 0);
> +	if (data_counters_only) {
> +		for (p = startport; p <= node->numports; p++) {
> +			if (node->ports[p]) {
> +				if (node->type == IB_NODE_SWITCH)
> +					ib_portid_set(&portid, node->smalid, 0, 0);
> +				else
> +					ib_portid_set(&portid, node->ports[p]->base_lid,
> +						      0, 0);
> +
> +				print_data_cnts(&portid, cap_mask, node_name, node, p,
> +						&header_printed);
> +				summary.ports_checked++;
> +				if (!all_port_sup)
> +					clear_port(&portid, cap_mask, node_name, p);
> +			}
> +		}
> +	} else {
> +		if (all_port_sup)
> +			if (!print_errors(&portid, cap_mask, node_name, node,
> +					  0xFF, &header_printed)) {
> +				summary.ports_checked += node->numports;
> +				goto clear;
> +			}
>  
> -			print_port(&portid, cap_mask, node_name, node, p,
> -				   &header_printed);
> -			summary.ports_checked++;
> -			if (!all_port_sup)
> -				clear_port(&portid, cap_mask, node_name, p);
> +		for (p = startport; p <= node->numports; p++) {
> +			if (node->ports[p]) {
> +				if (node->type == IB_NODE_SWITCH)
> +					ib_portid_set(&portid, node->smalid, 0, 0);
> +				else
> +					ib_portid_set(&portid, node->ports[p]->base_lid,
> +						      0, 0);
> +
> +				print_errors(&portid, cap_mask, node_name, node, p,
> +					     &header_printed);
> +				summary.ports_checked++;
> +				if (!all_port_sup)
> +					clear_port(&portid, cap_mask, node_name, p);
> +			}
>  		}
>  	}
>  
> @@ -713,6 +790,9 @@ static int process_opt(void *context, int ch, char *optarg)
>  	case 8:
>  		threshold_file = strdup(optarg);
>  		break;
> +	case 9:
> +		data_counters_only = 1;
> +		break;
>  	case 'G':
>  	case 'S':
>  		node_guid_str = optarg;
> @@ -771,11 +851,12 @@ int main(int argc, char **argv)
>  		 "specify an alternate thresold file, default: " DEF_THRES_FILE},
>  		{"GNDN", 'R', 0, NULL,
>  		 "(This option is obsolete and does nothing)"},
> -		{"data", 2, 0, NULL, "include the data counters in the output"},
> +		{"data", 2, 0, NULL, "include data counters for ports with errors"},
>  		{"switch", 3, 0, NULL, "print data for switches only"},
>  		{"ca", 4, 0, NULL, "print data for CA's only"},
>  		{"router", 5, 0, NULL, "print data for routers only"},
>  		{"details", 6, 0, NULL, "include transmit discard details"},
> +		{"counters", 9, 0, NULL, "print data counters only"},
>  		{"clear-errors", 'k', 0, NULL,
>  		 "Clear error counters after read"},
>  		{"clear-counts", 'K', 0, NULL,

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 05/5 V2] infiniband-diags: ibqueryerrors; add --counters option
       [not found]     ` <4DB97DBF.20709-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
@ 2011-04-28 21:58       ` Ira Weiny
  0 siblings, 0 replies; 3+ messages in thread
From: Ira Weiny @ 2011-04-28 21:58 UTC (permalink / raw)
  To: Hal Rosenstock; +Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org


From: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
Date: Wed, 27 Apr 2011 01:07:59 -0700
Subject: [PATCH 05/5 V2] infiniband-diags: ibqueryerrors; add --counters option

Display the data counters (optionally extended data counters) for all ports in the fabric.

Chages in V2:
Only print Unicast/Multicast fields when IsExtendedWidthSupported is indicated.

Signed-off-by: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
---
 src/ibqueryerrors.c |  142 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 113 insertions(+), 29 deletions(-)

diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c
index 4445afc..0147d9c 100644
--- a/src/ibqueryerrors.c
+++ b/src/ibqueryerrors.c
@@ -62,6 +62,7 @@ static nn_map_t *node_name_map = NULL;
 static char *load_cache_file = NULL;
 
 int data_counters = 0;
+int data_counters_only = 0;
 int port_config = 0;
 uint64_t node_guid = 0;
 char *node_guid_str = NULL;
@@ -455,8 +456,68 @@ static int query_cap_mask(ib_portid_t * portid, char *node_name, int portnum,
 	return 0;
 }
 
-static int 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_data_cnts(ib_portid_t * portid, uint16_t cap_mask,
+			   char *node_name, ibnd_node_t * node, int portnum,
+			   int *header_printed)
+{
+	uint8_t pc[1024];
+	int i;
+	int start_field = IB_PC_XMT_BYTES_F;
+	int end_field = IB_PC_RCV_PKTS_F;
+
+	memset(pc, 0, 1024);
+
+	if (cap_mask & (IB_PM_EXT_WIDTH_SUPPORTED | IB_PM_EXT_WIDTH_NOIETF_SUP)) {
+		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
+				   IB_GSI_PORT_COUNTERS_EXT, ibmad_port)) {
+			IBWARN("IB_GSI_PORT_COUNTERS_EXT query failed on %s, %s port %d",
+			       node_name, portid2str(portid), portnum);
+			return (1);
+		}
+		start_field = IB_PC_EXT_XMT_BYTES_F;
+		if (cap_mask & IB_PM_EXT_WIDTH_SUPPORTED)
+			end_field = IB_PC_EXT_RCV_MPKTS_F;
+		else
+			end_field = IB_PC_EXT_RCV_PKTS_F;
+	} else {
+		if (!pma_query_via(pc, portid, portnum, ibd_timeout,
+				   IB_GSI_PORT_COUNTERS, ibmad_port)) {
+			IBWARN("IB_GSI_PORT_COUNTERS query failed on %s, %s port %d",
+			       node_name, portid2str(portid), portnum);
+			return (1);
+		}
+		start_field = IB_PC_XMT_BYTES_F;
+		end_field = IB_PC_RCV_PKTS_F;
+	}
+
+	if (!*header_printed) {
+		printf("Data Counters for 0x%" PRIx64 " \"%s\"\n", node->guid,
+		       node_name);
+		*header_printed = 1;
+	}
+
+	if (portnum == 0xFF)
+		printf("   GUID 0x%" PRIx64 " port ALL:", node->guid);
+	else
+		printf("   GUID 0x%" PRIx64 " port %d:",
+		       node->guid, portnum);
+
+	for (i = start_field; i <= end_field; i++) {
+		uint64_t val64 = 0;
+		mad_decode_field(pc, i, (void *)&val64);
+		printf(" [%s == %" PRIu64 "]", mad_field_name(i), val64);
+	}
+	printf("\n");
+
+	if (portnum != 0xFF && port_config)
+		print_port_config(node_name, node, portnum);
+
+	return (0);
+}
+
+static int print_errors(ib_portid_t * portid, uint16_t cap_mask,
+			char *node_name, ibnd_node_t * node, int portnum,
+			int *header_printed)
 {
 	uint8_t pc[1024];
 	uint8_t pce[1024];
@@ -538,9 +599,6 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
 	 */
 	uint32_t mask = 0;
 
-	if (!clear_errors && !clear_counts)
-		return;
-
 	if (clear_errors) {
 		mask |= 0xFFF;
 		if (cap_mask & IB_PM_PC_XMIT_WAIT_SUP)
@@ -549,11 +607,13 @@ static void clear_port(ib_portid_t * portid, uint16_t cap_mask,
 	if (clear_counts)
 		mask |= 0xF000;
 
-	if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-				   IB_GSI_PORT_COUNTERS, ibmad_port))
-		IBERROR("Failed to reset errors %s port %d", node_name, port);
+	if (mask)
+		if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
+					   IB_GSI_PORT_COUNTERS, ibmad_port))
+			IBERROR("Failed to reset errors %s port %d", node_name,
+				port);
 
-	if (details && clear_errors) {
+	if (clear_errors && details) {
 		memset(pc, 0, 1024);
 		performance_reset_via(pc, portid, port, 0xf, ibd_timeout,
 				      IB_GSI_PORT_XMIT_DISCARD_DETAILS,
@@ -624,29 +684,49 @@ void print_node(ibnd_node_t * node, void *user_data)
 			}
 		}
 	}
+
 	if ((query_cap_mask(&portid, node_name, p, &cap_mask) == 0) &&
-	    (cap_mask & IB_PM_ALL_PORT_SELECT)) {
+	    (cap_mask & IB_PM_ALL_PORT_SELECT))
 		all_port_sup = 1;
-		if (!print_port(&portid, cap_mask, node_name, node,
-				0xFF, &header_printed)) {
-			summary.ports_checked += node->numports;
-			goto clear;
-		}
-	}
 
-	for (p = startport; p <= node->numports; p++) {
-		if (node->ports[p]) {
-			if (node->type == IB_NODE_SWITCH)
-				ib_portid_set(&portid, node->smalid, 0, 0);
-			else
-				ib_portid_set(&portid, node->ports[p]->base_lid,
-					      0, 0);
+	if (data_counters_only) {
+		for (p = startport; p <= node->numports; p++) {
+			if (node->ports[p]) {
+				if (node->type == IB_NODE_SWITCH)
+					ib_portid_set(&portid, node->smalid, 0, 0);
+				else
+					ib_portid_set(&portid, node->ports[p]->base_lid,
+						      0, 0);
+
+				print_data_cnts(&portid, cap_mask, node_name, node, p,
+						&header_printed);
+				summary.ports_checked++;
+				if (!all_port_sup)
+					clear_port(&portid, cap_mask, node_name, p);
+			}
+		}
+	} else {
+		if (all_port_sup)
+			if (!print_errors(&portid, cap_mask, node_name, node,
+					  0xFF, &header_printed)) {
+				summary.ports_checked += node->numports;
+				goto clear;
+			}
 
-			print_port(&portid, cap_mask, node_name, node, p,
-				   &header_printed);
-			summary.ports_checked++;
-			if (!all_port_sup)
-				clear_port(&portid, cap_mask, node_name, p);
+		for (p = startport; p <= node->numports; p++) {
+			if (node->ports[p]) {
+				if (node->type == IB_NODE_SWITCH)
+					ib_portid_set(&portid, node->smalid, 0, 0);
+				else
+					ib_portid_set(&portid, node->ports[p]->base_lid,
+						      0, 0);
+
+				print_errors(&portid, cap_mask, node_name, node, p,
+					     &header_printed);
+				summary.ports_checked++;
+				if (!all_port_sup)
+					clear_port(&portid, cap_mask, node_name, p);
+			}
 		}
 	}
 
@@ -720,6 +800,9 @@ static int process_opt(void *context, int ch, char *optarg)
 	case 8:
 		threshold_file = strdup(optarg);
 		break;
+	case 9:
+		data_counters_only = 1;
+		break;
 	case 'G':
 	case 'S':
 		node_guid_str = optarg;
@@ -778,11 +861,12 @@ int main(int argc, char **argv)
 		 "specify an alternate thresold file, default: " DEF_THRES_FILE},
 		{"GNDN", 'R', 0, NULL,
 		 "(This option is obsolete and does nothing)"},
-		{"data", 2, 0, NULL, "include the data counters in the output"},
+		{"data", 2, 0, NULL, "include data counters for ports with errors"},
 		{"switch", 3, 0, NULL, "print data for switches only"},
 		{"ca", 4, 0, NULL, "print data for CA's only"},
 		{"router", 5, 0, NULL, "print data for routers only"},
 		{"details", 6, 0, NULL, "include transmit discard details"},
+		{"counters", 9, 0, NULL, "print data counters only"},
 		{"clear-errors", 'k', 0, NULL,
 		 "Clear error counters after read"},
 		{"clear-counts", 'K', 0, NULL,
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-04-28 21:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-28  1:47 [PATCH 05/5] infiniband-diags: ibqueryerrors; add --counters option Ira Weiny
     [not found] ` <20110427184700.f2a561c6.weiny2-i2BcT+NCU+M@public.gmane.org>
2011-04-28 14:46   ` Hal Rosenstock
     [not found]     ` <4DB97DBF.20709-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2011-04-28 21:58       ` [PATCH 05/5 V2] " Ira Weiny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox