From patchwork Wed Apr 10 11:21:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083328 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="JsscobM0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDX00h5z9s70 for ; Wed, 10 Apr 2019 21:21:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730311AbfDJLVa (ORCPT ); Wed, 10 Apr 2019 07:21:30 -0400 Received: from mail.kernel.org ([198.145.29.99]:36178 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLV3 (ORCPT ); Wed, 10 Apr 2019 07:21:29 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B2D1F20820; Wed, 10 Apr 2019 11:21:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895288; bh=Pq5QPeaZFDfqLl4yGhKLhV4JN2ryjPxj9dtWaqB2sxw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JsscobM03DiVa4JY/zUZQk64Zu5kGLS/BDhTJlmHcc/ZBusgXYSprE5AwxY91tEXg U/2ANorPPonPIsx4zyqoaettJ4i/md1u6Yl9iEYpfyLN00xvm0WHIZY+HumnZISVt7 Zis55eM4oxNTuTfuLHdqtnYOdYtAo5No3HWVfffE= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 1/8] rdma: Update uapi headers to add statistic counter support Date: Wed, 10 Apr 2019 14:21:14 +0300 Message-Id: <20190410112121.6790-2-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang Update rdma_netlink.h for statistic counter support, which allows a user to monitor specific QPs categories. Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/include/uapi/rdma/rdma_netlink.h | 82 +++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h index 23a90ad5..44d9f35b 100644 --- a/rdma/include/uapi/rdma/rdma_netlink.h +++ b/rdma/include/uapi/rdma/rdma_netlink.h @@ -49,17 +49,6 @@ enum { RDMA_NL_IWPM_NUM_OPS }; -struct rdma_cm_id_stats { - __u32 qp_num; - __u32 bound_dev_if; - __u32 port_space; - __s32 pid; - __u8 cm_state; - __u8 node_type; - __u8 port_num; - __u8 qp_type; -}; - enum { IWPM_NLA_REG_PID_UNSPEC = 0, IWPM_NLA_REG_PID_SEQ, @@ -261,7 +250,10 @@ enum rdma_nldev_command { RDMA_NLDEV_CMD_PORT_GET, /* can dump */ - /* 6 - 8 are free to use */ + RDMA_NLDEV_CMD_SYS_GET, /* can dump */ + RDMA_NLDEV_CMD_SYS_SET, + + /* 8 is free to use */ RDMA_NLDEV_CMD_RES_GET = 9, /* can dump */ @@ -275,6 +267,12 @@ enum rdma_nldev_command { RDMA_NLDEV_CMD_RES_PD_GET, /* can dump */ + RDMA_NLDEV_CMD_STAT_SET, + + RDMA_NLDEV_CMD_STAT_GET, /* can dump */ + + RDMA_NLDEV_CMD_STAT_DEL, + RDMA_NLDEV_NUM_OPS }; @@ -472,9 +470,69 @@ enum rdma_nldev_attr { */ RDMA_NLDEV_ATTR_LINK_TYPE, /* string */ + /* + * net namespace mode for rdma subsystem: + * either shared or exclusive among multiple net namespaces. + */ + RDMA_NLDEV_SYS_ATTR_NETNS_MODE, /* u8 */ + /* + * File descriptor handle of the net namespace object + */ + RDMA_NLDEV_NET_NS_FD, /* u32 */ + + /* + * Device protocol, e.g. ib, iw, usnic, roce and opa + */ + RDMA_NLDEV_ATTR_DEV_PROTOCOL, /* string */ + /* + * Counter-specific attributes. + */ + RDMA_NLDEV_ATTR_STAT_MODE, /* u32 */ + RDMA_NLDEV_ATTR_STAT_RES, /* u32 */ + RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK, /* u32 */ + RDMA_NLDEV_ATTR_STAT_COUNTER, /* nested table */ + RDMA_NLDEV_ATTR_STAT_COUNTER_ENTRY, /* nested table */ + RDMA_NLDEV_ATTR_STAT_COUNTER_ID, /* u32 */ + RDMA_NLDEV_ATTR_STAT_HWCOUNTERS, /* nested table */ + RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY, /* nested table */ + RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME, /* string */ + RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE, /* u64 */ /* * Always the end */ RDMA_NLDEV_ATTR_MAX }; + +/* + * Supported counter bind modes. All modes are mutual-exclusive. + */ +enum rdma_nl_counter_mode { + RDMA_COUNTER_MODE_NONE, + + /* + * A qp is bound with a counter automatically during initialization + * based on the auto mode (e.g., qp type, ...) + */ + RDMA_COUNTER_MODE_AUTO, + + /* + * Which qp are bound with which counter is explicitly specified + * by the user + */ + RDMA_COUNTER_MODE_MANUAL, + + /* + * Always the end + */ + RDMA_COUNTER_MODE_MAX, +}; + +/* + * Supported criteria in counter auto mode. + * Currently only "qp type" is supported + */ +enum rdma_nl_counter_mask { + RDMA_COUNTER_MASK_QP_TYPE = 1, +}; + #endif /* _RDMA_NETLINK_H */ From patchwork Wed Apr 10 11:21:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083329 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="f7wbyS0X"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDZ5kKWz9s70 for ; Wed, 10 Apr 2019 21:21:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731234AbfDJLVd (ORCPT ); Wed, 10 Apr 2019 07:21:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:36222 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVc (ORCPT ); Wed, 10 Apr 2019 07:21:32 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2B44C2082A; Wed, 10 Apr 2019 11:21:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895291; bh=V7v45lzec2GLk61/sOCN18lSKIPQaZVy5b4nZJm2d9A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f7wbyS0XnlqCgwwG87Be0Xl+hlihCagj+xgUkoP4xcmc78Xl3wNPYBjhTN1b0+31r vD+53ztfy5d8K8223yWIlQSBJrvlAbO2yzHwvzOmN0QXvENe0umlDaIIenouHhno0y ILiut6RQE8b5GOL5D+ZxhY3W0abBQ31+eR2Qm4eM= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 2/8] rdma: Add "stat qp show" support Date: Wed, 10 Apr 2019 14:21:15 +0300 Message-Id: <20190410112121.6790-3-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang Show qp counters statistics in detail. Filters are also enabled. Examples: $ rdma stat qp show link mlx5_2/1 cntn 5 pid 31609 comm client.1 rx_write_requests 0 rx_read_requests 0 rx_atomic_requests 0 out_of_buffer 0 out_of_sequence 0 duplicate_request 0 rnr_nak_retry_err 0 packet_seq_err 0 implied_nak_seq_err 0 local_ack_timeout_err 0 resp_local_length_error 0 resp_cqe_error 0 req_cqe_error 0 req_remote_invalid_request 0 req_remote_access_errors 0 resp_remote_access_errors 0 resp_cqe_flush_error 0 req_cqe_flush_error 0 LQPN: <178> $ rdma stat show link mlx5_2/1 Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/rdma.c | 3 +- rdma/rdma.h | 1 + rdma/stat.c | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/utils.c | 7 ++ 5 files changed, 274 insertions(+), 2 deletions(-) create mode 100644 rdma/stat.c diff --git a/rdma/Makefile b/rdma/Makefile index 6a424234..e1af4414 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -7,7 +7,7 @@ ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \ - res-cmid.o res-qp.o + res-cmid.o res-qp.o stat.o TARGETS += rdma endif diff --git a/rdma/rdma.c b/rdma/rdma.c index 676e03c2..c8984764 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -11,7 +11,7 @@ static void help(char *name) { pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" " %s [ -f[orce] ] -b[atch] filename\n" - "where OBJECT := { dev | link | resource | help }\n" + "where OBJECT := { dev | link | resource | statistic | help }\n" " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n", name, name); } @@ -29,6 +29,7 @@ static int rd_cmd(struct rd *rd, int argc, char **argv) { "dev", cmd_dev }, { "link", cmd_link }, { "resource", cmd_res }, + { "statistic", cmd_stat }, { 0 } }; diff --git a/rdma/rdma.h b/rdma/rdma.h index 9ed9e045..b5ddcb07 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -93,6 +93,7 @@ char *rd_argv(struct rd *rd); int cmd_dev(struct rd *rd); int cmd_link(struct rd *rd); int cmd_res(struct rd *rd); +int cmd_stat(struct rd *rd); int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str); int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)); int rd_exec_require_dev(struct rd *rd, int (*cb)(struct rd *rd)); diff --git a/rdma/stat.c b/rdma/stat.c new file mode 100644 index 00000000..0c3abc99 --- /dev/null +++ b/rdma/stat.c @@ -0,0 +1,263 @@ +/* + * stat.c RDMA tool + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Authors: Mark Zhang + */ + +#include "rdma.h" +#include "res.h" +#include + +static int stat_help(struct rd *rd) +{ + pr_out("Usage: %s [ OPTIONS ] statistic { COMMAND | help }\n", rd->filename); + pr_out(" %s statistic OBJECT show\n", rd->filename); + pr_out(" %s statistic OBJECT show link [ DEV/PORT_INDEX ] [ FILTER-NAME FILTER-VALUE ]\n", rd->filename); + pr_out("Examples:\n"); + pr_out(" %s statistic qp show\n", rd->filename); + pr_out(" %s statistic qp show link mlx5_2/1\n", rd->filename); + + return 0; +} + +static int res_show_hwcounters(struct rd *rd, struct nlattr *hwc_table) +{ + struct nlattr *nla_entry; + const char *nm; + uint64_t v; + int err; + + mnl_attr_for_each_nested(nla_entry, hwc_table) { + struct nlattr *hw_line[RDMA_NLDEV_ATTR_MAX] = {}; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, hw_line); + if (err != MNL_CB_OK) + return -EINVAL; + + if (!hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME] || + !hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]) { + return -EINVAL; + } + + nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]); + v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]); + res_print_uint(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]); + } + + return MNL_CB_OK; +} + +static int res_counter_line(struct rd *rd, const char *name, int index, + struct nlattr **nla_line) +{ + uint32_t cntn, port = 0, pid = 0, qpn; + struct nlattr *hwc_table, *qp_table; + struct nlattr *nla_entry; + const char *comm = NULL; + int err; + + if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) + port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); + + hwc_table = nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]; + qp_table = nla_line[RDMA_NLDEV_ATTR_RES_QP]; + if (!hwc_table || !qp_table || + !nla_line[RDMA_NLDEV_ATTR_STAT_COUNTER_ID]) + return MNL_CB_ERROR; + + cntn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_STAT_COUNTER_ID]); + if (rd_is_filtered_attr(rd, "cntn", cntn, + nla_line[RDMA_NLDEV_ATTR_STAT_COUNTER_ID])) + return MNL_CB_OK; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) + return MNL_CB_OK; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + mnl_attr_for_each_nested(nla_entry, qp_table) { + struct nlattr *qp_line[RDMA_NLDEV_ATTR_MAX] = {}; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, qp_line); + if (err != MNL_CB_OK) + return -EINVAL; + + if (!qp_line[RDMA_NLDEV_ATTR_RES_LQPN]) + return -EINVAL; + + qpn = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd_is_filtered_attr(rd, "lqpn", qpn, + qp_line[RDMA_NLDEV_ATTR_RES_LQPN])) + return MNL_CB_OK; + } + + if (rd->json_output) { + jsonw_string_field(rd->jw, "ifname", name); + if (port) + jsonw_uint_field(rd->jw, "port", port); + jsonw_uint_field(rd->jw, "cntn", cntn); + } else { + if (port) + pr_out("link %s/%u cntn %u ", name, port, cntn); + else + pr_out("dev %s cntn %u ", name, cntn); + } + + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(rd, comm, nla_line); + + err = res_show_hwcounters(rd, hwc_table); + if (err != MNL_CB_OK) + return err; + + mnl_attr_for_each_nested(nla_entry, qp_table) { + struct nlattr *qp_line[RDMA_NLDEV_ATTR_MAX] = {}; + static bool isfirst = true; + + if (isfirst && !rd->json_output) + pr_out("\n LQPN: <"); + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, qp_line); + if (err != MNL_CB_OK) + return -EINVAL; + + if (!qp_line[RDMA_NLDEV_ATTR_RES_LQPN]) + return -EINVAL; + + qpn = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd->json_output) { + jsonw_uint_field(rd->jw, "lqpn", qpn); + } else { + if (isfirst) + pr_out("%d", qpn); + else + pr_out(", %d", qpn); + } + isfirst = false; + } + + if (!rd->json_output) + pr_out(">\n"); + return MNL_CB_OK; +} + +static int stat_qp_show_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + uint32_t idx; + int ret; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_STAT_COUNTER]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_STAT_COUNTER]; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + + ret = res_counter_line(rd, name, idx, nla_line); + if (ret != MNL_CB_OK) + break; + } + + return ret; +} + +static const struct filters stat_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "cntn", .is_number = true }, + { .name = "lqpn", .is_number = true }, + { .name = "pid", .is_number = true }, +}; + +static int stat_qp_show_one_link(struct rd *rd) +{ + int flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP; + uint32_t seq; + int ret; + + if (!rd->port_idx) + return 0; + + ret = rd_build_filter(rd, stat_valid_filters); + if (ret) + return ret; + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_GET, &seq, flags); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, stat_qp_show_parse_cb, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + + return ret; +} + +static int stat_qp_show_link(struct rd *rd) +{ + return rd_exec_link(rd, stat_qp_show_one_link, false); +} + +static int stat_qp_show(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_qp_show_link }, + { "link", stat_qp_show_link }, + { "help", stat_help }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +static int stat_qp(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_qp_show }, + { "show", stat_qp_show }, + { "list", stat_qp_show }, + { "help", stat_help }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +int cmd_stat(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_help }, + { "help", stat_help }, + { "qp", stat_qp }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "statistic command"); +} diff --git a/rdma/utils.c b/rdma/utils.c index 11ed8a73..ff781517 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -435,6 +435,13 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_DRIVER_U32] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_DRIVER_S64] = MNL_TYPE_U64, [RDMA_NLDEV_ATTR_DRIVER_U64] = MNL_TYPE_U64, + [RDMA_NLDEV_ATTR_STAT_COUNTER] = MNL_TYPE_NESTED, + [RDMA_NLDEV_ATTR_STAT_COUNTER_ENTRY] = MNL_TYPE_NESTED, + [RDMA_NLDEV_ATTR_STAT_COUNTER_ID] = MNL_TYPE_U32, + [RDMA_NLDEV_ATTR_STAT_HWCOUNTERS] = MNL_TYPE_NESTED, + [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY] = MNL_TYPE_NESTED, + [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME] = MNL_TYPE_NUL_STRING, + [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE] = MNL_TYPE_U64, }; int rd_attr_check(const struct nlattr *attr, int *typep) From patchwork Wed Apr 10 11:21:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083330 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="xWEuJH/i"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDf5CTKz9s70 for ; Wed, 10 Apr 2019 21:21:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731250AbfDJLVh (ORCPT ); Wed, 10 Apr 2019 07:21:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:36258 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVg (ORCPT ); Wed, 10 Apr 2019 07:21:36 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9A3D020820; Wed, 10 Apr 2019 11:21:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895295; bh=hHRtRWL3pCkoLbI7jiv/ZjZifwVY2qOwB7jeMyxM7uM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xWEuJH/icFF4dUCxdn53+e1hs4OgYLx7INm5dK176lxb44EQOkm6W4zUAQWfnCsmr /B+YfmcIs1XXV+LndA/AEmGT5cjIc8Gy9bpbRQ7FNG/Jd4JbB2mXhhuOJksbnWJvFa pIU5Y5eqdaZ53amq/jnzR22NTZueva25129BdKds= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 3/8] rdma: Add get per-port counter mode support Date: Wed, 10 Apr 2019 14:21:16 +0300 Message-Id: <20190410112121.6790-4-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang Add an interface to show which mode is in active. Examples: $ rdma statistic qp mode 0/1: mlx5_0/1: qp auto off 1/1: mlx5_1/1: qp auto off 2/1: mlx5_2/1: qp auto type on 3/1: mlx5_3/1: qp auto off $ rdma statistic qp mode link mlx5_0 0/1: mlx5_0/1: qp auto off Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/stat.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/utils.c | 2 + 2 files changed, 142 insertions(+) diff --git a/rdma/stat.c b/rdma/stat.c index 0c3abc99..f11252f7 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -18,13 +18,152 @@ static int stat_help(struct rd *rd) pr_out("Usage: %s [ OPTIONS ] statistic { COMMAND | help }\n", rd->filename); pr_out(" %s statistic OBJECT show\n", rd->filename); pr_out(" %s statistic OBJECT show link [ DEV/PORT_INDEX ] [ FILTER-NAME FILTER-VALUE ]\n", rd->filename); + pr_out(" %s statistic OBJECT mode\n", rd->filename); + pr_out("where OBJECT: = { qp }\n"); pr_out("Examples:\n"); pr_out(" %s statistic qp show\n", rd->filename); pr_out(" %s statistic qp show link mlx5_2/1\n", rd->filename); + pr_out(" %s statistic qp mode\n", rd->filename); + pr_out(" %s statistic qp mode link mlx5_0\n", rd->filename); return 0; } +struct counter_param { + char *name; + uint32_t attr; +}; + +static struct counter_param auto_params[] = { + { "type", RDMA_COUNTER_MASK_QP_TYPE, }, + { NULL }, +}; + +static int prepare_auto_mode_str(struct nlattr **tb, uint32_t mask, + char *output, int len) +{ + char s[] = "qp auto"; + int i, outlen = strlen(s); + + memset(output, 0, len); + snprintf(output, len, "%s", s); + + if (mask) { + for (i = 0; auto_params[i].name != NULL; i++) { + if (mask & auto_params[i].attr) { + outlen += strlen(auto_params[i].name) + 1; + if (outlen >= len) + return -EINVAL; + strcat(output, " "); + strcat(output, auto_params[i].name); + } + } + + if (outlen + strlen(" on") >= len) + return -EINVAL; + strcat(output, " on"); + } else { + if (outlen + strlen(" off") >= len) + return -EINVAL; + strcat(output, " off"); + } + + return 0; +} + +static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + uint32_t mode = 0, mask = 0; + char output[128] = {0}; + struct rd *rd = data; + uint32_t idx, port; + const char *name; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) { + pr_err("This tool doesn't support switches yet\n"); + return MNL_CB_ERROR; + } + + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + if (tb[RDMA_NLDEV_ATTR_STAT_MODE]) + mode = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_MODE]); + + if (mode == RDMA_COUNTER_MODE_AUTO) { + if (!tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]) + return MNL_CB_ERROR; + mask = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]); + prepare_auto_mode_str(tb, mask, output, sizeof(output)); + } else { + snprintf(output, sizeof(output), "qp auto off"); + } + + if (rd->json_output) { + jsonw_uint_field(rd->jw, "ifindex", idx); + jsonw_uint_field(rd->jw, "port", port); + jsonw_string_field(rd->jw, "mode", output); + } else { + pr_out("%u/%u: %s/%u: %s\n", idx, port, name, port, output); + } + + return MNL_CB_OK; +} + +static int stat_one_qp_link_get_mode(struct rd *rd) +{ + uint32_t seq; + int ret; + + if (!rd->port_idx) + return 0; + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_GET, + &seq, (NLM_F_REQUEST | NLM_F_ACK)); + + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + /* Make RDMA_NLDEV_ATTR_STAT_MODE valid so that kernel knows + * return only mode instead of all counters + */ + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_MODE, + RDMA_COUNTER_MODE_MANUAL); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES, RDMA_NLDEV_ATTR_RES_QP); + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, qp_link_get_mode_parse_cb, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + + return ret; +} + +static int stat_qp_link_get_mode(struct rd* rd) +{ + return rd_exec_link(rd, stat_one_qp_link_get_mode, false); +} + +static int stat_qp_get_mode(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_qp_link_get_mode }, + { "link", stat_qp_link_get_mode }, + { "help", stat_help }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + static int res_show_hwcounters(struct rd *rd, struct nlattr *hwc_table) { struct nlattr *nla_entry; @@ -243,6 +382,7 @@ static int stat_qp(struct rd *rd) { NULL, stat_qp_show }, { "show", stat_qp_show }, { "list", stat_qp_show }, + { "mode", stat_qp_get_mode }, { "help", stat_help }, { 0 } }; diff --git a/rdma/utils.c b/rdma/utils.c index ff781517..5ad6c961 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -442,6 +442,8 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY] = MNL_TYPE_NESTED, [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME] = MNL_TYPE_NUL_STRING, [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE] = MNL_TYPE_U64, + [RDMA_NLDEV_ATTR_STAT_MODE] = MNL_TYPE_U32, + [RDMA_NLDEV_ATTR_STAT_RES] = MNL_TYPE_U32, }; int rd_attr_check(const struct nlattr *attr, int *typep) From patchwork Wed Apr 10 11:21:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083331 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="oSB8diEI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDj49Zrz9s00 for ; Wed, 10 Apr 2019 21:21:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731276AbfDJLVk (ORCPT ); Wed, 10 Apr 2019 07:21:40 -0400 Received: from mail.kernel.org ([198.145.29.99]:36306 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVj (ORCPT ); Wed, 10 Apr 2019 07:21:39 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1108920820; Wed, 10 Apr 2019 11:21:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895298; bh=d9K+E2Iqk/FrQW7RU+ZEnwnrgojZZkAp/1jUR9/j8Bc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oSB8diEI0/rf0cL/KtrK5BvopzFEEZL4G0lDgY/MtdIknC40O/npQzG8IEf5iteV9 Edz82PowxK3Q+q9V7EZCuBmQSYapeyMbU4AxO96u5pkYPRu6ZmxnEUqS0NVBPj9kdP k6E60R7f1bKDFbPmlCe87as7oso8B2tE/4XtfqCo= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 4/8] rdma: Add rdma statistic counter per-port auto mode support Date: Wed, 10 Apr 2019 14:21:17 +0300 Message-Id: <20190410112121.6790-5-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang With per-QP statistic counter support, a user is allowed to monitor specific QPs categories, which are bound to/unbound from counters dynamically allocated/deallocated. In per-port "auto" mode, QPs are bound to counters automatically according to common criteria. For example a per "type"(qp type) scheme, where in each process all QPs have same qp type are bind automatically to a single counter. Currently only "type" (qp type) is supported. Examples: $ rdma statistic qp set link mlx5_2/1 auto type on $ rdma statistic qp set link mlx5_2/1 auto off Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/stat.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/utils.c | 1 + 2 files changed, 104 insertions(+) diff --git a/rdma/stat.c b/rdma/stat.c index f11252f7..aec0e837 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -19,12 +19,17 @@ static int stat_help(struct rd *rd) pr_out(" %s statistic OBJECT show\n", rd->filename); pr_out(" %s statistic OBJECT show link [ DEV/PORT_INDEX ] [ FILTER-NAME FILTER-VALUE ]\n", rd->filename); pr_out(" %s statistic OBJECT mode\n", rd->filename); + pr_out(" %s statistic OBJECT set COUNTER_SCOPE [DEV/PORT_INDEX] auto {CRITERIA | off}\n", rd->filename); pr_out("where OBJECT: = { qp }\n"); + pr_out(" CRITERIA : = { type }\n"); + pr_out(" COUNTER_SCOPE: = { link | dev }\n"); pr_out("Examples:\n"); pr_out(" %s statistic qp show\n", rd->filename); pr_out(" %s statistic qp show link mlx5_2/1\n", rd->filename); pr_out(" %s statistic qp mode\n", rd->filename); pr_out(" %s statistic qp mode link mlx5_0\n", rd->filename); + pr_out(" %s statistic qp set link mlx5_2/1 auto type on\n", rd->filename); + pr_out(" %s statistic qp set link mlx5_2/1 auto off\n", rd->filename); return 0; } @@ -376,6 +381,103 @@ static int stat_qp_show(struct rd *rd) return rd_exec_cmd(rd, cmds, "parameter"); } +static int qp_set_link_auto_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + return MNL_CB_OK; +} + +static int stat_qp_set_link_auto_sendmsg(struct rd *rd, uint32_t mask) +{ + uint32_t seq; + int ret; + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_SET, + &seq, (NLM_F_REQUEST | NLM_F_ACK)); + + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES, RDMA_NLDEV_ATTR_RES_QP); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_MODE, + RDMA_COUNTER_MODE_AUTO); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK, mask); + + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, qp_set_link_auto_parse_cb, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + + return ret; +} + +static int stat_one_qp_set_link_auto_off(struct rd *rd) +{ + return stat_qp_set_link_auto_sendmsg(rd, 0); +} + +static int stat_one_qp_set_auto_type_on(struct rd *rd) +{ + return stat_qp_set_link_auto_sendmsg(rd, RDMA_COUNTER_MASK_QP_TYPE); +} + +static int stat_one_qp_set_link_auto_type(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_help }, + { "on", stat_one_qp_set_auto_type_on }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +static int stat_one_qp_set_link_auto(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_one_qp_link_get_mode }, + { "off", stat_one_qp_set_link_auto_off }, + { "type", stat_one_qp_set_link_auto_type }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +static int stat_one_qp_set_link(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_one_qp_link_get_mode }, + { "auto", stat_one_qp_set_link_auto }, + { 0 } + }; + + if (!rd->port_idx) + return 0; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +static int stat_qp_set_link(struct rd *rd) +{ + return rd_exec_link(rd, stat_one_qp_set_link, false); +} + +static int stat_qp_set(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_help }, + { "link", stat_qp_set_link }, + { "help", stat_help }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + static int stat_qp(struct rd *rd) { const struct rd_cmd cmds[] = { @@ -383,6 +485,7 @@ static int stat_qp(struct rd *rd) { "show", stat_qp_show }, { "list", stat_qp_show }, { "mode", stat_qp_get_mode }, + { "set", stat_qp_set }, { "help", stat_help }, { 0 } }; diff --git a/rdma/utils.c b/rdma/utils.c index 5ad6c961..1fda2879 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -444,6 +444,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { [RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE] = MNL_TYPE_U64, [RDMA_NLDEV_ATTR_STAT_MODE] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_STAT_RES] = MNL_TYPE_U32, + [RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK] = MNL_TYPE_U32, }; int rd_attr_check(const struct nlattr *attr, int *typep) From patchwork Wed Apr 10 11:21:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083333 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="0MCmnlhD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDr6jW5z9s00 for ; Wed, 10 Apr 2019 21:21:48 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731321AbfDJLVr (ORCPT ); Wed, 10 Apr 2019 07:21:47 -0400 Received: from mail.kernel.org ([198.145.29.99]:36398 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVq (ORCPT ); Wed, 10 Apr 2019 07:21:46 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E46D720818; Wed, 10 Apr 2019 11:21:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895305; bh=dqPAlVZ+ueRijL7tllwHbPSVK/xWFUD26zIVw3fkwXc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0MCmnlhDROLo3lNyMtg4sQdsk39xN3pmQu6Yo9CX6GVg+e3msQG995j9Q8PFdDdFg JGjiRGaAWRNaBMB+hG6auxovRRxCLuAc87+Ih7i1DMuu+Os8vjOCzVdT4VvurWoriI cuNEDB0Y7x3RGomzsbR54AICrzvjqtqtOZYjfTq4= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 5/8] rdma: Make get_port_from_argv() returns valid port in strict port mode Date: Wed, 10 Apr 2019 14:21:18 +0300 Message-Id: <20190410112121.6790-6-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang When strict_port is set, make get_port_from_argv() returns failure if no valid port is specified. Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rdma/utils.c b/rdma/utils.c index 1fda2879..8dc06fc6 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -56,7 +56,7 @@ bool rd_no_arg(struct rd *rd) * mlx5_1/1 | 1 | false * mlx5_1/- | 0 | false * - * In strict mode, /- will return error. + * In strict port mode, a non-0 port must be provided */ static int get_port_from_argv(struct rd *rd, uint32_t *port, bool *is_dump_all, bool strict_port) @@ -64,7 +64,7 @@ static int get_port_from_argv(struct rd *rd, uint32_t *port, char *slash; *port = 0; - *is_dump_all = true; + *is_dump_all = strict_port ? false : true; slash = strchr(rd_argv(rd), '/'); /* if no port found, return 0 */ @@ -83,6 +83,9 @@ static int get_port_from_argv(struct rd *rd, uint32_t *port, if (!*port && strlen(slash)) return -EINVAL; } + if (strict_port && (*port == 0)) + return -EINVAL; + return 0; } From patchwork Wed Apr 10 11:21:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083332 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="cwgJL6U0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMDn3jnCz9s00 for ; Wed, 10 Apr 2019 21:21:45 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730785AbfDJLVo (ORCPT ); Wed, 10 Apr 2019 07:21:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:36356 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVn (ORCPT ); Wed, 10 Apr 2019 07:21:43 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6C7EC20820; Wed, 10 Apr 2019 11:21:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895302; bh=PhJYZ3S5wa3FfMH2rsU44pTFnX6gJJ+OkrQcNGxgDMQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cwgJL6U0za5aQ4WGlObzW5NBIAG4L0WEePgDCIZsVZera+gyLRUsliF5sQfu12WTw Y/P1BCPjKwtOefj6OUqZz19VfGrwgR8jMG2sK1JRF7iRmgVi+P+bcyAmVo01VdTaLY e7mpvxYzNLY/7aOpCQE1QpEvycp0dla6tFzcg7nU= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 6/8] rdma: Add stat manual mode support Date: Wed, 10 Apr 2019 14:21:19 +0300 Message-Id: <20190410112121.6790-7-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang In manual mode a QP can be manually bound to a counter. If counter is not specified that kernel will allocate one. And in unbind if lqpn is not specified then all QPs on this counter will be unbound. The manual and auto mode are mutual-exclusive. Examples: $ rdma statistic qp bind link mlx5_2/1 lqpn 178 $ rdma statistic qp bind link mlx5_2/1 lqpn 178 cntn 4 $ rdma statistic qp unbind link mlx5_2/1 cntn 4 $ rdma statistic qp unbind link mlx5_2/1 cntn 4 lqpn 178 Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/stat.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/rdma/stat.c b/rdma/stat.c index aec0e837..c5395692 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -20,6 +20,8 @@ static int stat_help(struct rd *rd) pr_out(" %s statistic OBJECT show link [ DEV/PORT_INDEX ] [ FILTER-NAME FILTER-VALUE ]\n", rd->filename); pr_out(" %s statistic OBJECT mode\n", rd->filename); pr_out(" %s statistic OBJECT set COUNTER_SCOPE [DEV/PORT_INDEX] auto {CRITERIA | off}\n", rd->filename); + pr_out(" %s statistic OBJECT bind COUNTER_SCOPE [DEV/PORT_INDEX] [OBJECT-ID] [COUNTER-ID]\n", rd->filename); + pr_out(" %s statistic OBJECT unbind COUNTER_SCOPE [DEV/PORT_INDEX] [COUNTER-ID]\n", rd->filename); pr_out("where OBJECT: = { qp }\n"); pr_out(" CRITERIA : = { type }\n"); pr_out(" COUNTER_SCOPE: = { link | dev }\n"); @@ -30,6 +32,10 @@ static int stat_help(struct rd *rd) pr_out(" %s statistic qp mode link mlx5_0\n", rd->filename); pr_out(" %s statistic qp set link mlx5_2/1 auto type on\n", rd->filename); pr_out(" %s statistic qp set link mlx5_2/1 auto off\n", rd->filename); + pr_out(" %s statistic qp bind link mlx5_2/1 lqpn 178\n", rd->filename); + pr_out(" %s statistic qp bind link mlx5_2/1 lqpn 178 cntn 4\n", rd->filename); + pr_out(" %s statistic qp unbind link mlx5_2/1 cntn 4\n", rd->filename); + pr_out(" %s statistic qp unbind link mlx5_2/1 cntn 4 lqpn 178\n", rd->filename); return 0; } @@ -478,6 +484,216 @@ static int stat_qp_set(struct rd *rd) return rd_exec_cmd(rd, cmds, "parameter"); } +static int qp_bind_unbind_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_LQPN] || !tb[RDMA_NLDEV_ATTR_STAT_COUNTER_ID]) + return MNL_CB_ERROR; + + return MNL_CB_OK; +} + +static int stat_get_arg(struct rd *rd, const char *arg) +{ + int value = 0; + char *endp; + + if (strcmpx(rd_argv(rd), arg) != 0) + return -EINVAL; + + rd_arg_inc(rd); + value = strtol(rd_argv(rd), &endp, 10); + rd_arg_inc(rd); + + return value; +} + +static int stat_one_qp_bind(struct rd *rd) +{ + int lqpn = 0, cntn = 0, ret; + uint32_t seq; + + if (rd_no_arg(rd)) { + stat_help(rd); + return -EINVAL; + } + + ret = rd_build_filter(rd, stat_valid_filters); + if (ret) + return ret; + + lqpn = stat_get_arg(rd, "lqpn"); + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_SET, + &seq, (NLM_F_REQUEST | NLM_F_ACK)); + + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_MODE, + RDMA_COUNTER_MODE_MANUAL); + + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES, RDMA_NLDEV_ATTR_RES_QP); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_RES_LQPN, lqpn); + + if (rd_argc(rd)) { + cntn = stat_get_arg(rd, "cntn"); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_COUNTER_ID, + cntn); + } + + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, qp_bind_unbind_parse_cb, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + + return ret; +} + +static int do_stat_qp_unbind_lqpn(struct rd *rd, uint32_t cntn, uint32_t lqpn) +{ + uint32_t seq; + int ret; + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_DEL, + &seq, (NLM_F_REQUEST | NLM_F_ACK)); + + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_MODE, + RDMA_COUNTER_MODE_MANUAL); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES, RDMA_NLDEV_ATTR_RES_QP); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_COUNTER_ID, cntn); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_RES_LQPN, lqpn); + + ret = rd_send_msg(rd); + if (ret) + return ret; + + return rd_recv_msg(rd, qp_bind_unbind_parse_cb, rd, seq); +} + +static int stat_get_counter_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + uint32_t lqpn, cntn; + int err; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + + if (!tb[RDMA_NLDEV_ATTR_STAT_COUNTER_ID]) + return MNL_CB_ERROR; + cntn = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_COUNTER_ID]); + + nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; + if (!nla_table) + return MNL_CB_ERROR; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return -EINVAL; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) + return -EINVAL; + + lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + err = do_stat_qp_unbind_lqpn(rd, cntn, lqpn); + if (err) + return MNL_CB_ERROR; + } + + return MNL_CB_OK; +} + +static int stat_one_qp_unbind(struct rd *rd) +{ + int flags = NLM_F_REQUEST | NLM_F_ACK, ret; + char buf[MNL_SOCKET_BUFFER_SIZE]; + int lqpn = 0, cntn = 0; + unsigned int portid; + uint32_t seq; + + ret = rd_build_filter(rd, stat_valid_filters); + if (ret) + return ret; + + cntn = stat_get_arg(rd, "cntn"); + if (rd_argc(rd)) { + lqpn = stat_get_arg(rd, "lqpn"); + return do_stat_qp_unbind_lqpn(rd, cntn, lqpn); + } + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_GET, &seq, flags); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_COUNTER_ID, cntn); + ret = rd_send_msg(rd); + if (ret) + return ret; + + + /* Can't use rd_recv_msg() since the callback also calls it (recursively), + * then rd_recv_msg() always return -1 here + */ + portid = mnl_socket_get_portid(rd->nl); + ret = mnl_socket_recvfrom(rd->nl, buf, sizeof(buf)); + if (ret <= 0) + return ret; + + ret = mnl_cb_run(buf, ret, seq, portid, stat_get_counter_parse_cb, rd); + mnl_socket_close(rd->nl); + if (ret != MNL_CB_OK) + return ret; + + return 0; +} + +static int stat_qp_bind_link(struct rd *rd) +{ + return rd_exec_link(rd, stat_one_qp_bind, true); +} + +static int stat_qp_bind(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_help }, + { "link", stat_qp_bind_link }, + { "help", stat_help }, + { 0 }, + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + +static int stat_qp_unbind_link(struct rd *rd) +{ + return rd_exec_link(rd, stat_one_qp_unbind, true); +} + +static int stat_qp_unbind(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_help }, + { "link", stat_qp_unbind_link }, + { "help", stat_help }, + { 0 }, + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + static int stat_qp(struct rd *rd) { const struct rd_cmd cmds[] = { @@ -486,6 +702,8 @@ static int stat_qp(struct rd *rd) { "list", stat_qp_show }, { "mode", stat_qp_get_mode }, { "set", stat_qp_set }, + { "bind", stat_qp_bind }, + { "unbind", stat_qp_unbind }, { "help", stat_help }, { 0 } }; From patchwork Wed Apr 10 11:21:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083335 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="NsbO4QwE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMF45h2wz9s4V for ; Wed, 10 Apr 2019 21:22:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731407AbfDJLV7 (ORCPT ); Wed, 10 Apr 2019 07:21:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:36520 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLV7 (ORCPT ); Wed, 10 Apr 2019 07:21:59 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 027FA2084B; Wed, 10 Apr 2019 11:21:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895317; bh=tKq9n8Jckn4GLIr4RvPfW5orUg7hxCsilB/Q4VkV7mM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NsbO4QwEMlxXcrDmOb+h7eqelGgogQpC9v3k3owJC4zFuf8PRFLYbcnyZjcEOHekh /ZhyDVhWk4Ax58stm98h4Jlyv8Jt+OiZ+hTWSvN61cxKh004SaxIeooBWn/67PVNBw CkMdHBZIF0SvZA8fFjkJZN/h2Tt6YDeQXKiJC8fg= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 7/8] rdma: Add default counter show support Date: Wed, 10 Apr 2019 14:21:20 +0300 Message-Id: <20190410112121.6790-8-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang Show default counter statistics, which are same through the sysfs interface: /sys/class/infiniband//ports//hw_counters/ Example: $ rdma stat show link mlx5_2/1 link mlx5_2/1 rx_write_requests 8 rx_read_requests 4 rx_atomic_requests 0 out_of_buffer 0 out_of_sequence 0 duplicate_request 0 rnr_nak_retry_err 0 packet_seq_err 0 implied_nak_seq_err 0 local_ack_timeout_err 0 resp_local_length_error 0 resp_cqe_error 0 req_cqe_error 0 req_remote_invalid_request 0 req_remote_access_errors 0 resp_remote_access_errors 0 resp_cqe_flush_error 0 req_cqe_flush_error 0 rp_cnp_ignored 0 rp_cnp_handled 0 np_ecn_marked_roce_packets 0 np_cnp_sent 0 rx_icrc_encapsulated 0 Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- rdma/stat.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/rdma/stat.c b/rdma/stat.c index c5395692..cf2f0a02 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -22,6 +22,8 @@ static int stat_help(struct rd *rd) pr_out(" %s statistic OBJECT set COUNTER_SCOPE [DEV/PORT_INDEX] auto {CRITERIA | off}\n", rd->filename); pr_out(" %s statistic OBJECT bind COUNTER_SCOPE [DEV/PORT_INDEX] [OBJECT-ID] [COUNTER-ID]\n", rd->filename); pr_out(" %s statistic OBJECT unbind COUNTER_SCOPE [DEV/PORT_INDEX] [COUNTER-ID]\n", rd->filename); + pr_out(" %s statistic show\n", rd->filename); + pr_out(" %s statistic show link [ DEV/PORT_INDEX ]\n", rd->filename); pr_out("where OBJECT: = { qp }\n"); pr_out(" CRITERIA : = { type }\n"); pr_out(" COUNTER_SCOPE: = { link | dev }\n"); @@ -36,6 +38,8 @@ static int stat_help(struct rd *rd) pr_out(" %s statistic qp bind link mlx5_2/1 lqpn 178 cntn 4\n", rd->filename); pr_out(" %s statistic qp unbind link mlx5_2/1 cntn 4\n", rd->filename); pr_out(" %s statistic qp unbind link mlx5_2/1 cntn 4 lqpn 178\n", rd->filename); + pr_out(" %s statistic show\n", rd->filename); + pr_out(" %s statistic show link mlx5_2/1\n", rd->filename); return 0; } @@ -711,10 +715,84 @@ static int stat_qp(struct rd *rd) return rd_exec_cmd(rd, cmds, "parameter"); } +static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + uint32_t port; + int ret; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_PORT_INDEX] || + !tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); + if (rd->json_output) { + jsonw_string_field(rd->jw, "ifname", name); + jsonw_uint_field(rd->jw, "port", port); + } else { + pr_out("link %s/%u ", name, port); + } + + ret = res_show_hwcounters(rd, tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]); + + if (!rd->json_output) + pr_out("\n"); + return ret; +} + +static int stat_show_one_link(struct rd *rd) +{ + int flags = NLM_F_REQUEST | NLM_F_ACK; + uint32_t seq; + int ret; + + if (!rd->port_idx) + return 0; + + rd_prepare_msg(rd, RDMA_NLDEV_CMD_STAT_GET, &seq, flags); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, stat_show_parse_cb, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + + return ret; +} + +static int stat_show_link(struct rd *rd) +{ + return rd_exec_link(rd, stat_show_one_link, false); +} + +static int stat_show(struct rd *rd) +{ + const struct rd_cmd cmds[] = { + { NULL, stat_show_link }, + { "link", stat_show_link }, + { "help", stat_help }, + { 0 } + }; + + return rd_exec_cmd(rd, cmds, "parameter"); +} + int cmd_stat(struct rd *rd) { const struct rd_cmd cmds[] = { - { NULL, stat_help }, + { NULL, stat_show }, + { "show", stat_show }, + { "list", stat_show }, { "help", stat_help }, { "qp", stat_qp }, { 0 } From patchwork Wed Apr 10 11:21:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1083334 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="WBL4nXV5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44fMF06hMyz9s00 for ; Wed, 10 Apr 2019 21:21:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731399AbfDJLVz (ORCPT ); Wed, 10 Apr 2019 07:21:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:36478 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728757AbfDJLVz (ORCPT ); Wed, 10 Apr 2019 07:21:55 -0400 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8D1A320818; Wed, 10 Apr 2019 11:21:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554895314; bh=q2+Q9ZNhGqA6L9Gs+attVDtiaZuypxnvTa2io47PmZ8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WBL4nXV5MlkNlA3iVSdX8zSK94ZgtNU6J4c+eMR7xvtxtU9v0b2/gHTrmHmE1R2vT Dw5ukx4b2s4LJEXWoyeMIKBk39qCbpJ9ltkDb9AMKcz0M1Mh1r5urvWqAtXiC7aqAb oRh5Yme29qry8cqgJMMePFxD4mWUB7c7GrKkxFok= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , Mark Zhang , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 8/8] rdma: Document counter statistic Date: Wed, 10 Apr 2019 14:21:21 +0300 Message-Id: <20190410112121.6790-9-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190410112121.6790-1-leon@kernel.org> References: <20190410112121.6790-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mark Zhang Add document of accessing the QP counter, including bind/unbind a QP to a counter manually or automatically, and dump counter statistics. Signed-off-by: Mark Zhang Signed-off-by: Leon Romanovsky --- man/man8/rdma-dev.8 | 1 + man/man8/rdma-link.8 | 1 + man/man8/rdma-resource.8 | 1 + man/man8/rdma-statistic.8 | 170 ++++++++++++++++++++++++++++++++++++++ man/man8/rdma.8 | 5 ++ 5 files changed, 178 insertions(+) create mode 100644 man/man8/rdma-statistic.8 diff --git a/man/man8/rdma-dev.8 b/man/man8/rdma-dev.8 index 069f4717..f1b81033 100644 --- a/man/man8/rdma-dev.8 +++ b/man/man8/rdma-dev.8 @@ -63,6 +63,7 @@ Renames the mlx5_3 device to rdma_0. .BR rdma (8), .BR rdma-link (8), .BR rdma-resource (8), +.BR rdma-statistic (8), .br .SH AUTHOR diff --git a/man/man8/rdma-link.8 b/man/man8/rdma-link.8 index b3b40de7..32f80228 100644 --- a/man/man8/rdma-link.8 +++ b/man/man8/rdma-link.8 @@ -97,6 +97,7 @@ Removes RXE link rxe_eth0 .BR rdma (8), .BR rdma-dev (8), .BR rdma-resource (8), +.BR rdma-statistic (8), .br .SH AUTHOR diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8 index 40b073db..05030d0a 100644 --- a/man/man8/rdma-resource.8 +++ b/man/man8/rdma-resource.8 @@ -103,6 +103,7 @@ Show CQs belonging to pid 30489 .BR rdma (8), .BR rdma-dev (8), .BR rdma-link (8), +.BR rdma-statistic (8), .br .SH AUTHOR diff --git a/man/man8/rdma-statistic.8 b/man/man8/rdma-statistic.8 new file mode 100644 index 00000000..3a48ae8d --- /dev/null +++ b/man/man8/rdma-statistic.8 @@ -0,0 +1,170 @@ +.TH RDMA\-STATISTIC 8 "17 Mar 2019" "iproute2" "Linux" +.SH NAME +rdma-statistic \- RDMA statistic counter configuration +.SH SYNOPSIS +.sp +.ad l +.in +8 +.ti -8 +.B rdma +.RI "[ " OPTIONS " ]" +.B statistic +.RI " { " COMMAND " | " +.BR help " }" +.sp + +.ti -8 +.B rdma statistic +.RI "[ " OBJECT " ]" +.B show + +.ti -8 +.B rdma statistic +.RI "[ " OBJECT " ]" +.B show link +.RI "[ " DEV/PORT_INDX " ]" + +.ti -8 +.B rdma statistic +.IR OBJECT +.B mode + +.ti -8 +.B rdma statistic +.IR OBJECT +.B set +.IR COUNTER_SCOPE +.RI "[ " DEV/PORT_INDEX "]" +.B auto +.RI "{ " CRITERIA " | " +.BR off " }" + +.ti -8 +.B rdma statistic +.IR OBJECT +.B bind +.IR COUNTER_SCOPE +.RI "[ " DEV/PORT_INDEX "]" +.RI "[ " OBJECT-ID " ]" +.RI "[ " COUNTER-ID " ]" + +.ti -8 +.B rdma statistic +.IR OBJECT +.B unbind +.IR COUNTER_SCOPE +.RI "[ " DEV/PORT_INDEX "]" +.RI "[ " COUNTER-ID " ]" +.RI "[ " OBJECT-ID " ]" + +.ti -8 +.IR COUNTER_SCOPE " := " +.RB "{ " link " | " dev " }" + +.ti -8 +.IR OBJECT " := " +.RB "{ " qp " }" + +.ti -8 +.IR CRITERIA " := " +.RB "{ " type " }" + +.SH "DESCRIPTION" +.SS rdma statistic [object] show - Queries the specified RDMA device for RDMA and driver-specific statistics. Show the default counter if object is not specified + +.PP +.I "DEV" +- specifies counters on this RDMA device to show. + +.I "PORT_INDEX" +- specifies counters on this RDMA port to show. + +.SS rdma statistic set - configure counter statistic auto-mode for a specific device/port +In auto mode all objects belong to one category are bind automatically to a single counter set. + +.SS rdma statistic bind - manually bind an object (e.g., a qp) with a counter +When bound the statistics of this object are available in this counter. + +.SS rdma statistic unbind - manually unbind an object (e.g., a qp) from the counter previously bound +When unbound the statistics of this object are no longer available in this counter; And if object id is not specified then all objects on this counter will be unbound. + +.I "LQPN" +- specifies the qp number to be bound/unbind. + +.I "COUNTER-ID" +- specifies the id of the counter to be bound. +If this argument is omitted then a new counter will be allocated. + +.SH "EXAMPLES" +.PP +rdma statistic show +.RS 4 +Shows the state of the default counter of all RDMA devices on the system. +.RE +.PP +rdma statistic show link mlx5_2/1 +.RS 4 +Shows the state of the default counter of specified RDMA port +.RE +.PP +rdma statistic qp show +.RS 4 +Shows the state of all qp counters of all RDMA devices on the system. +.RE +.PP +rdma statistic qp show link mlx5_2/1 +.RS 4 +Shows the state of all qp counters of specified RDMA port. +.RE +.PP +rdma statistic qp show link mlx5_2 pid 30489 +.RS 4 +Shows the state of all qp counters of specified RDMA port and belonging to pid 30489 +.RE +.PP +rdma statistic qp mode +.RS 4 +List current counter mode on all deivces +.RE +.PP +rdma statistic qp mode link mlx5_2/1 +.RS 4 +List current counter mode of deivce mlx5_2 port 1 +.RE +.PP +rdma statistic qp set link mlx5_2/1 auto type on +.RS 4 +On device mlx5_2 port 1, for each new QP bind it with a counter automatically. Per counter for QPs with same qp type in each process. Currently only "type" is supported. +.RE +.PP +rdma statistic qp set link mlx5_2/1 auto off +.RS 4 +Turn-off auto mode on device mlx5_2 port 1. The allocated counters can be manually accessed. +.RE +.PP +rdma statistic qp bind link mlx5_2/1 lqpn 178 +.RS 4 +On device mlx5_2 port 1, allocate a counter and bind the specified qp on it +.RE +.PP +rdma statistic qp unbind link mlx5_2/1 cntn 4 lqpn 178 +.RS 4 +On device mlx5_2 port 1, bind the specified qp on the specified counter +.RE +.PP +rdma statistic qp unbind link mlx5_2/1 cntn 4 +.RS 4 +On device mlx5_2 port 1, unbind all QPs on the specified counter. After that this counter will be released automatically by the kernel. + +.RE +.PP + +.SH SEE ALSO +.BR rdma (8), +.BR rdma-dev (8), +.BR rdma-link (8), +.BR rdma-resource (8), +.br + +.SH AUTHOR +Mark Zhang diff --git a/man/man8/rdma.8 b/man/man8/rdma.8 index b2b5aef8..63a2dd21 100644 --- a/man/man8/rdma.8 +++ b/man/man8/rdma.8 @@ -70,6 +70,10 @@ Generate JSON output. .B link - RDMA port related. +.TP +.B statistic +- RDMA counter statistic related. + .PP The names of all objects may be written in full or abbreviated form, for example @@ -107,6 +111,7 @@ Exit status is 0 if command was successful or a positive integer upon failure. .BR rdma-dev (8), .BR rdma-link (8), .BR rdma-resource (8), +.BR rdma-statistic (8), .br .SH REPORTING BUGS