From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06A0FC73C7B for ; Wed, 10 Jul 2019 07:25:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D31A22064A for ; Wed, 10 Jul 2019 07:25:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1562743526; bh=oXNAxpjwh9nlKPHsBydBqueLpSUXhiQEV2sMq+jvq24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=DHXXvjR4+XamWTmw5jGWUerAWaa3GtQmtQsznDvdL6TDjyqecjXjbuhgLE/zTc206 O7fzOakaCWesEqiKpGDj21PIsnGVvrGOQy77clTsqxf8ZxM9TWAVEvSVBW1jWq5B90 xeAlFqPTBikf3Ly7xz+bc+l6oSNVNYej3Y7QQ92Q= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727281AbfGJHZ0 (ORCPT ); Wed, 10 Jul 2019 03:25:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:50918 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726043AbfGJHZZ (ORCPT ); Wed, 10 Jul 2019 03:25:25 -0400 Received: from localhost (unknown [37.142.3.125]) (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 B817620838; Wed, 10 Jul 2019 07:25:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1562743524; bh=oXNAxpjwh9nlKPHsBydBqueLpSUXhiQEV2sMq+jvq24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hYAsxIAlvAxlAKAhFwp+EWYEpr8wu25WlGxpg0r7gk628rgFCKuHOQPviKWqqrEf3 hfiQot2CowDvu3peK27Wi+pHhH+JeRAuhMVlEcdOhvOKvB9qkyjVnMvgmJ0oqpMTS5 Rh43hNvXbwYlo7T5F0nbTnajCrqaQY6pSDTU3G8s= From: Leon Romanovsky To: Stephen Hemminger Cc: Leon Romanovsky , netdev , David Ahern , Mark Zhang , RDMA mailing list Subject: [PATCH iproute2-rc 7/8] rdma: Add default counter show support Date: Wed, 10 Jul 2019 10:24:54 +0300 Message-Id: <20190710072455.9125-8-leon@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190710072455.9125-1-leon@kernel.org> References: <20190710072455.9125-1-leon@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/rdma/stat.c b/rdma/stat.c index 942c1ac3..ef0bbcf1 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -17,6 +17,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"); @@ -31,6 +33,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; } @@ -674,10 +678,78 @@ 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_get_hwcounters(rd, tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true); + + 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; + + return rd_recv_msg(rd, stat_show_parse_cb, rd, seq); +} + +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 } -- 2.20.1