[ofa-general] [PATCH] ib-diag/vendstat: counter-group-info & config-counter-group vendor mads
Or Gerlitz
ogerlitz at voltaire.com
Thu Mar 19 05:27:25 PDT 2009
Implement counter-group-info and config-counter-group IS4 vendor mads.
The config-counter-group mad should be used to configure a switch port
to make counters such as PortXmitDataSL or PortRcvDataSL active.
Signed-off-by: Or Gerlitz <ogerlitz at voltaire.com>
Index: management/infiniband-diags/src/vendstat.c
===================================================================
--- management.orig/infiniband-diags/src/vendstat.c
+++ management/infiniband-diags/src/vendstat.c
@@ -52,6 +52,8 @@
/* Vendor specific Attribute IDs */
#define IB_MLX_IS3_GENERAL_INFO 0x17
#define IB_MLX_IS3_CONFIG_SPACE_ACCESS 0x50
+#define IB_MLX_IS4_COUNTER_GROUP_INFO 0x90
+#define IB_MLX_IS4_CONFIG_COUNTER_GROUP 0x91
/* Config space addresses */
#define IB_MLX_IS3_PORT_XMIT_WAIT 0x10013C
@@ -105,10 +107,15 @@ typedef struct {
is3_record_t record[18];
} is3_config_space_t;
+void counter_groups_info(ib_portid_t *portid, int port);
+void config_counter_groups(ib_portid_t *portid, int port);
+
static int general_info, xmit_wait = 0;
+static int counter_group_info, config_counter_group, cg0, cg1;
static int process_opt(void *context, int ch, char *optarg)
{
+ int ret;
switch (ch) {
case 'N':
general_info = 1;
@@ -116,6 +123,15 @@ static int process_opt(void *context, in
case 'w':
xmit_wait = 1;
break;
+ case 'i':
+ counter_group_info = 1;
+ break;
+ case 'c':
+ config_counter_group = 1;
+ ret = sscanf(optarg, "%d,%d", &cg0, &cg1);
+ if (ret != 2)
+ return -1;
+ break;
default:
return -1;
}
@@ -136,12 +152,17 @@ int main(int argc, char **argv)
const struct ibdiag_opt opts[] = {
{ "N", 'N', 0, NULL, "show IS3 general information"},
{ "w", 'w', 0, NULL, "show IS3 port xmit wait counters"},
+ { "i", 'i', 0, NULL, "show is4 counter group info"},
+ { "c", 'c', 1, "<num,num>", "set is4 config counter group"},
{ 0 }
};
- char usage_args[] = "<lid|guid>";
+
+ char usage_args[] = "<lid|guid> [port]";
const char *usage_examples[] = {
"-N 6\t\t# read IS3 general information",
"-w 6\t\t# read IS3 port xmit wait counters",
+ "-i 6 12\t# read IS4 port 12 counter group info",
+ "-c 0,1 6 12\t# set IS4 port 12 config counter group for XmitDataSL",
NULL
};
@@ -167,13 +188,23 @@ int main(int argc, char **argv)
IBERROR("can't resolve self port %s", argv[0]);
}
+ if (counter_group_info) {
+ counter_groups_info(&portid, port);
+ exit(0);
+ }
+
+ if (config_counter_group) {
+ config_counter_groups(&portid, port);
+ exit(0);
+ }
+
+ /* These are Mellanox specific vendor MADs */
+ /* but vendors change the VendorId so how know for sure ? */
/* Only General Info and Port Xmit Wait Counters */
/* queries are currently supported */
if (!general_info && !xmit_wait)
IBERROR("at least one of -N and -w must be specified");
- /* These are Mellanox specific vendor MADs */
- /* but vendors change the VendorId so how know for sure ? */
/* Would need a list of these and it might not be complete */
/* so for right now, punt on this */
@@ -249,3 +280,94 @@ int main(int argc, char **argv)
exit(0);
}
+
+
+#define COUNTER_GROUPS_NUM 2
+
+typedef struct {
+ uint8_t reserved1[8];
+ uint8_t reserved[3];
+ uint8_t num_of_counter_groups;
+ uint32_t group_masks[COUNTER_GROUPS_NUM];
+} is4_counter_group_info_t;
+
+typedef struct {
+ uint8_t reserved[3];
+ uint8_t group_select;
+} is4_group_select_t;
+
+typedef struct {
+ uint8_t reserved1[8];
+ uint8_t reserved[4];
+ is4_group_select_t group_selects[COUNTER_GROUPS_NUM];
+} is4_config_counter_groups_t;
+
+
+void counter_groups_info(ib_portid_t *portid, int port)
+{
+ char buf[1024];
+ ib_vendor_call_t call;
+ is4_counter_group_info_t *cg_info;
+ int i, num_cg;
+
+ memset(&call, 0, sizeof(call));
+ call.mgmt_class = IB_MLX_VENDOR_CLASS;
+ call.method = IB_MAD_METHOD_GET;
+ call.timeout = ibd_timeout;
+ call.attrid = IB_MLX_IS4_COUNTER_GROUP_INFO;
+ call.mod = port;
+
+ /* Counter Group Info */
+ memset(&buf, 0, sizeof(buf));
+ if (!ib_vendor_call_via(&buf, portid, &call, srcport))
+ IBERROR("counter group info query");
+
+ cg_info = (is4_counter_group_info_t *)&buf;
+ num_cg = cg_info->num_of_counter_groups;
+ printf("counter_group_info:\n");
+ printf("%d counter groups\n", num_cg);
+ for (i = 0; i < num_cg; i++)
+ printf("group%d mask %#x\n", i, ntohl(cg_info->group_masks[i]));
+}
+
+/* Group0 counter config values */
+#define IS4_G0_PortXmtDataSL_0_7 0
+#define IS4_G0_PortXmtDataSL_8_15 1
+#define IS4_G0_PortRcvDataSL_0_7 2
+
+/* Group1 counter config values */
+#define IS4_G1_PortXmtDataSL_8_15 1
+#define IS4_G1_PortRcvDataSL_0_7 2
+#define IS4_G1_PortRcvDataSL_8_15 8
+
+void config_counter_groups(ib_portid_t *portid, int port)
+{
+ char buf[1024];
+ ib_vendor_call_t call;
+ is4_config_counter_groups_t *cg_config;
+
+ memset(&call, 0, sizeof(call));
+ call.mgmt_class = IB_MLX_VENDOR_CLASS;
+ call.attrid = IB_MLX_IS4_CONFIG_COUNTER_GROUP;
+ call.timeout = ibd_timeout;
+ call.mod = port;
+ /* set config counter groups for groups 0 and 1 */
+ call.method = IB_MAD_METHOD_SET;
+
+ memset(&buf, 0, sizeof(buf));
+ cg_config = (is4_config_counter_groups_t *)&buf;
+
+ printf("counter_groups_config: configuring group0 %d group1 %d\n", cg0, cg1);
+ cg_config->group_selects[0].group_select = cg0;
+ cg_config->group_selects[1].group_select = cg1;
+
+ if (!ib_vendor_call_via(&buf, portid, &call, srcport))
+ IBERROR("config counter group set");
+
+ /* get config counter groups */
+ memset(&buf, 0, sizeof(buf));
+ call.method = IB_MAD_METHOD_GET;
+
+ if (!ib_vendor_call_via(&buf, portid, &call, srcport))
+ IBERROR("config counter group query");
+}
More information about the general
mailing list