From patchwork Tue Nov 6 12:49:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Varghese, Vipin" X-Patchwork-Id: 47893 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 46BE04F94; Tue, 6 Nov 2018 13:53:12 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id AC3984D3A for ; Tue, 6 Nov 2018 13:53:10 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Nov 2018 04:53:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,471,1534834800"; d="scan'208";a="105696546" Received: from unknown (HELO saesrv02-S2600CWR.intel.com) ([10.224.122.203]) by fmsmga001.fm.intel.com with ESMTP; 06 Nov 2018 04:53:07 -0800 From: Vipin Varghese To: dev@dpdk.org, thomas@monjalon.net, reshma.pattan@intel.com, stephen@networkplumber.org, john.mcnamara@intel.com Cc: stephen1.byrne@intel.com, michael.j.glynn@intel.com, amol.patel@intel.com, Vipin Varghese Date: Tue, 6 Nov 2018 18:19:08 +0530 Message-Id: <20181106124912.40700-5-vipin.varghese@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181106124912.40700-1-vipin.varghese@intel.com> References: <20181106124912.40700-1-vipin.varghese@intel.com> Subject: [dpdk-dev] [PATCH v4 5/9] app/procinfo: add support for show tm X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Function show_tm is used for displaying the tm PMD under the primary process. This covers basic and per node|level details with stats. Signed-off-by: Vipin Varghese --- V3: - memset for struct elements - Vipin Varghese - code cleanup for TM - Vipin Varghese - fetch for leaf nodes if node exist - Jasvinder Singh - display MARCO to function - Reshma Pathan & Stephen Hemminger V2: - MACRO for display node|level - cap - Vipin Varghese --- app/proc-info/main.c | 276 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 275 insertions(+), 1 deletion(-) diff --git a/app/proc-info/main.c b/app/proc-info/main.c index 48477097f..8ec2e9474 100644 --- a/app/proc-info/main.c +++ b/app/proc-info/main.c @@ -32,6 +32,7 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 @@ -752,10 +753,283 @@ show_port(void) STATS_BDR_STR(50, ""); } +static void +display_nodecap_info(int is_leaf, struct rte_tm_node_capabilities *cap) +{ + if (cap == NULL) + return; + + if (!is_leaf) { + printf("\t -- nonleaf sched max:\n" + "\t\t + children (%u)\n" + "\t\t + sp priorities (%u)\n" + "\t\t + wfq children per group (%u)\n" + "\t\t + wfq groups (%u)\n" + "\t\t + wfq weight (%u)\n", + cap->nonleaf.sched_n_children_max, + cap->nonleaf.sched_sp_n_priorities_max, + cap->nonleaf.sched_wfq_n_children_per_group_max, + cap->nonleaf.sched_wfq_n_groups_max, + cap->nonleaf.sched_wfq_weight_max); + } else { + printf("\t -- leaf cman support:\n" + "\t\t + wred pkt mode (%d)\n" + "\t\t + wred byte mode (%d)\n" + "\t\t + head drop (%d)\n" + "\t\t + wred context private (%d)\n" + "\t\t + wred context shared (%u)\n", + cap->leaf.cman_wred_packet_mode_supported, + cap->leaf.cman_wred_byte_mode_supported, + cap->leaf.cman_head_drop_supported, + cap->leaf.cman_wred_context_private_supported, + cap->leaf.cman_wred_context_shared_n_max); + } +} + +static void +display_levelcap_info(int is_leaf, struct rte_tm_level_capabilities *cap) +{ + if (cap == NULL) + return; + + if (!is_leaf) { + printf("\t -- shaper private: (%d) dual rate (%d)\n", + cap->nonleaf.shaper_private_supported, + cap->nonleaf.shaper_private_dual_rate_supported); + printf("\t -- shaper share: (%u)\n", + cap->nonleaf.shaper_shared_n_max); + printf("\t -- non leaf sched MAX:\n" + "\t\t + children (%u)\n" + "\t\t + sp (%u)\n" + "\t\t + wfq children per group (%u)\n" + "\t\t + wfq groups (%u)\n" + "\t\t + wfq weight (%u)\n", + cap->nonleaf.sched_n_children_max, + cap->nonleaf.sched_sp_n_priorities_max, + cap->nonleaf.sched_wfq_n_children_per_group_max, + cap->nonleaf.sched_wfq_n_groups_max, + cap->nonleaf.sched_wfq_weight_max); + } else { + printf("\t -- shaper private: (%d) dual rate (%d)\n", + cap->leaf.shaper_private_supported, + cap->leaf.shaper_private_dual_rate_supported); + printf("\t -- shaper share: (%u)\n", + cap->leaf.shaper_shared_n_max); + printf(" -- leaf cman support:\n" + "\t\t + wred pkt mode (%d)\n" + "\t\t + wred byte mode (%d)\n" + "\t\t + head drop (%d)\n" + "\t\t + wred context private (%d)\n" + "\t\t + wred context shared (%u)\n", + cap->leaf.cman_wred_packet_mode_supported, + cap->leaf.cman_wred_byte_mode_supported, + cap->leaf.cman_head_drop_supported, + cap->leaf.cman_wred_context_private_supported, + cap->leaf.cman_wred_context_shared_n_max); + } +} + static void show_tm(void) { - printf(" tm\n"); + int ret = 0, check_for_leaf = 0, is_leaf = 0; + unsigned int j, k; + uint16_t i = 0; + + snprintf(bdr_str, MAX_STRING_LEN, " show - TM PMD %"PRIu64, + rte_get_tsc_hz()); + STATS_BDR_STR(10, bdr_str); + + RTE_ETH_FOREACH_DEV(i) { + struct rte_eth_dev_info dev_info; + struct rte_tm_capabilities cap; + struct rte_tm_error error; + struct rte_tm_node_capabilities capnode; + struct rte_tm_level_capabilities caplevel; + uint32_t n_leaf_nodes = 0; + + memset(&dev_info, 0, sizeof(dev_info)); + memset(&cap, 0, sizeof(cap)); + memset(&error, 0, sizeof(error)); + + rte_eth_dev_info_get(i, &dev_info); + printf(" - Generic for port (%u)\n" + "\t -- driver name %s\n" + "\t -- max vf (%u)\n" + "\t -- max tx queues (%u)\n" + "\t -- number of tx queues (%u)\n", + i, + dev_info.driver_name, + dev_info.max_vfs, + dev_info.max_tx_queues, + dev_info.nb_tx_queues); + + ret = rte_tm_capabilities_get(i, &cap, &error); + if (ret) + continue; + + printf(" - MAX: nodes (%u) levels (%u) children (%u)\n", + cap.n_nodes_max, + cap.n_levels_max, + cap.sched_n_children_max); + + printf(" - identical nodes: non leaf (%d) leaf (%d)\n", + cap.non_leaf_nodes_identical, + cap.leaf_nodes_identical); + + printf(" - Shaper MAX:\n" + "\t -- total (%u)\n" + "\t -- private (%u) private dual (%d)\n" + "\t -- shared (%u) shared dual (%u)\n", + cap.shaper_n_max, + cap.shaper_private_n_max, + cap.shaper_private_dual_rate_n_max, + cap.shaper_shared_n_max, + cap.shaper_shared_dual_rate_n_max); + + printf(" - mark support:\n"); + printf("\t -- vlan dei: GREEN (%d) YELLOW (%d) RED (%d)\n", + cap.mark_vlan_dei_supported[RTE_TM_GREEN], + cap.mark_vlan_dei_supported[RTE_TM_YELLOW], + cap.mark_vlan_dei_supported[RTE_TM_RED]); + printf("\t -- ip ecn tcp: GREEN (%d) YELLOW (%d) RED (%d)\n", + cap.mark_ip_ecn_tcp_supported[RTE_TM_GREEN], + cap.mark_ip_ecn_tcp_supported[RTE_TM_YELLOW], + cap.mark_ip_ecn_tcp_supported[RTE_TM_RED]); + printf("\t -- ip ecn sctp: GREEN (%d) YELLOW (%d) RED (%d)\n", + cap.mark_ip_ecn_sctp_supported[RTE_TM_GREEN], + cap.mark_ip_ecn_sctp_supported[RTE_TM_YELLOW], + cap.mark_ip_ecn_sctp_supported[RTE_TM_RED]); + printf("\t -- ip dscp: GREEN (%d) YELLOW (%d) RED (%d)\n", + cap.mark_ip_dscp_supported[RTE_TM_GREEN], + cap.mark_ip_dscp_supported[RTE_TM_YELLOW], + cap.mark_ip_dscp_supported[RTE_TM_RED]); + + printf(" - mask stats (0x%"PRIx64")" + " dynamic update (0x%"PRIx64")\n", + cap.stats_mask, + cap.dynamic_update_mask); + + printf(" - sched MAX:\n" + "\t -- total (%u)\n" + "\t -- sp levels (%u)\n" + "\t -- wfq children per group (%u)\n" + "\t -- wfq groups (%u)\n" + "\t -- wfq weight (%u)\n", + cap.sched_sp_n_priorities_max, + cap.sched_sp_n_priorities_max, + cap.sched_wfq_n_children_per_group_max, + cap.sched_wfq_n_groups_max, + cap.sched_wfq_weight_max); + + printf(" - CMAN support:\n" + "\t -- WRED mode: pkt (%d) byte (%d)\n" + "\t -- head drop (%d)\n", + cap.cman_wred_packet_mode_supported, + cap.cman_wred_byte_mode_supported, + cap.cman_head_drop_supported); + printf("\t -- MAX WRED CONTEXT:" + " total (%u) private (%u) shared (%u)\n", + cap.cman_wred_context_n_max, + cap.cman_wred_context_private_n_max, + cap.cman_wred_context_shared_n_max); + + for (j = 0; j < cap.n_nodes_max; j++) { + memset(&capnode, 0, sizeof(capnode)); + ret = rte_tm_node_capabilities_get(i, j, + &capnode, &error); + if (ret) + continue; + + check_for_leaf = 1; + + printf(" NODE %u\n", j); + printf("\t - shaper private: (%d) dual rate (%d)\n", + capnode.shaper_private_supported, + capnode.shaper_private_dual_rate_supported); + printf("\t - shaper shared max: (%u)\n", + capnode.shaper_shared_n_max); + printf("\t - stats mask %"PRIx64"\n", + capnode.stats_mask); + + ret = rte_tm_node_type_get(i, j, &is_leaf, &error); + if (ret) + continue; + + display_nodecap_info(is_leaf, &capnode); + } + + for (j = 0; j < cap.n_levels_max; j++) { + memset(&caplevel, 0, sizeof(caplevel)); + ret = rte_tm_level_capabilities_get(i, j, + &caplevel, &error); + if (ret) + continue; + + printf(" - Level %u\n", j); + printf("\t -- node MAX: %u non leaf %u leaf %u\n", + caplevel.n_nodes_max, + caplevel.n_nodes_nonleaf_max, + caplevel.n_nodes_leaf_max); + printf("\t -- indetical: non leaf %u leaf %u\n", + caplevel.non_leaf_nodes_identical, + caplevel.leaf_nodes_identical); + + for (k = 0; k < caplevel.n_nodes_max; k++) { + ret = rte_tm_node_type_get(i, k, + &is_leaf, &error); + if (ret) + continue; + + display_levelcap_info(is_leaf, &caplevel); + } + } + + if (check_for_leaf) { + ret = rte_tm_get_number_of_leaf_nodes(i, + &n_leaf_nodes, &error); + if (ret == 0) + printf(" - leaf nodes (%u)\n", n_leaf_nodes); + } + + for (j = 0; j < n_leaf_nodes; j++) { + struct rte_tm_node_stats stats; + memset(&stats, 0, sizeof(stats)); + + ret = rte_tm_node_stats_read(i, j, + &stats, &cap.stats_mask, 0, &error); + if (ret) + continue; + + printf(" - STATS for node (%u)\n", j); + printf(" -- pkts (%"PRIu64") bytes (%"PRIu64")\n", + stats.n_pkts, stats.n_bytes); + + ret = rte_tm_node_type_get(i, j, &is_leaf, &error); + if ((ret) | (!is_leaf)) + continue; + + printf(" -- leaf queued:" + " pkts (%"PRIu64") bytes (%"PRIu64")\n", + stats.leaf.n_pkts_queued, + stats.leaf.n_bytes_queued); + printf(" - dropped:\n" + "\t -- GREEN:" + " pkts (%"PRIu64") bytes (%"PRIu64")\n" + "\t -- YELLOW:" + " pkts (%"PRIu64") bytes (%"PRIu64")\n" + "\t -- RED:" + " pkts (%"PRIu64") bytes (%"PRIu64")\n", + stats.leaf.n_pkts_dropped[RTE_TM_GREEN], + stats.leaf.n_bytes_dropped[RTE_TM_GREEN], + stats.leaf.n_pkts_dropped[RTE_TM_YELLOW], + stats.leaf.n_bytes_dropped[RTE_TM_YELLOW], + stats.leaf.n_pkts_dropped[RTE_TM_RED], + stats.leaf.n_bytes_dropped[RTE_TM_RED]); + } + } + + STATS_BDR_STR(50, ""); } static void