DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly
@ 2019-02-14 15:42 David Marchand
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field David Marchand
                   ` (5 more replies)
  0 siblings, 6 replies; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


David Marchand (5):
  app/testpmd: remove unused fwd_ctx field
  app/testpmd: add missing newline when showing statistics
  app/testpmd: add missing transmit errors stats
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 451 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  22 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 316 insertions(+), 237 deletions(-)

-- 
1.8.3.1

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

* [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
@ 2019-02-14 15:42 ` David Marchand
  2019-02-18 19:55   ` Rami Rosen
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics David Marchand
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

Remove some leftover from a previous rework.

Fixes: c4bcc342c8ee ("app/testpmd: refactor ieee1588 forwarding")
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/testpmd.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index fa48878..85b791b 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -173,7 +173,6 @@ struct rte_port {
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	void                    *fwd_ctx;   /**< Forwarding mode context */
 	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
 	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
 	uint64_t                rx_bad_outer_l4_csum;
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field David Marchand
@ 2019-02-14 15:42 ` David Marchand
  2019-02-19  5:48   ` Rami Rosen
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats David Marchand
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 98c1baa..984155a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field David Marchand
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-02-14 15:42 ` David Marchand
  2019-02-14 16:30   ` Bruce Richardson
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 4/5] app/testpmd: remove useless casts on statistics David Marchand
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

pmd can report transmit errors but those stats are not accounted here.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/testpmd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 984155a..3acd97b 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1838,6 +1838,7 @@ struct extmem_param {
 		total_recv += stats.ipackets;
 		total_xmit += stats.opackets;
 		total_rx_dropped += stats.imissed;
+		port->tx_dropped += stats.oerrors;
 		total_tx_dropped += port->tx_dropped;
 		total_rx_nombuf  += stats.rx_nombuf;
 
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH 4/5] app/testpmd: remove useless casts on statistics
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
                   ` (2 preceding siblings ...)
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats David Marchand
@ 2019-02-14 15:42 ` David Marchand
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 5/5] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

Caught by code review while investigating the stats display code.
Switching all port and fwd engine statistics to uint64_t makes it
possible to drop all casts.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/testpmd.c | 62 ++++++++++++++++++--------------------------------
 app/test-pmd/testpmd.h | 12 +++++-----
 2 files changed, 28 insertions(+), 46 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 3acd97b..ab110b0 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,42 +1771,25 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
+		fwd_cycles += fs->core_cycles;
 #endif
 	}
 	total_recv = 0;
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH 5/5] app/testpmd: display/clear forwarding stats on demand
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
                   ` (3 preceding siblings ...)
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 4/5] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-02-14 15:42 ` David Marchand
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-02-14 15:42 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, rte_port can't be used to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 426 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 306 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index db53cc0..58b11b7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7386,6 +7386,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_fwd_parsed(void *parsed_result,
+	       __rte_unused struct cmdline *cl,
+	       __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_fwdall = {
+	.f = cmd_fwd_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_fwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index ab110b0..e70ad20 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,225 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		ports_stats[pt_id].tx_dropped += stats.oerrors;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1767,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1817,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1846,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,87 +1867,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles += fs->core_cycles;
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		port->tx_dropped += stats.oerrors;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 0291480..a20c2c9 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats David Marchand
@ 2019-02-14 16:30   ` Bruce Richardson
  2019-02-14 17:39     ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: Bruce Richardson @ 2019-02-14 16:30 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, wenzhuo.lu, jingjing.wu, bernard.iremonger

On Thu, Feb 14, 2019 at 04:42:50PM +0100, David Marchand wrote:
> pmd can report transmit errors but those stats are not accounted here.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
>  app/test-pmd/testpmd.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 984155a..3acd97b 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1838,6 +1838,7 @@ struct extmem_param {
>  		total_recv += stats.ipackets;
>  		total_xmit += stats.opackets;
>  		total_rx_dropped += stats.imissed;
> +		port->tx_dropped += stats.oerrors;
>  		total_tx_dropped += port->tx_dropped;
>  		total_rx_nombuf  += stats.rx_nombuf;
>  
> 
Without knowing as to whether the line is needed or not, the line itself
looks out of place. All other lines are assignments to local variables,
apart from this. Should a local variable be defined for consistency?

/Bruce

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-14 16:30   ` Bruce Richardson
@ 2019-02-14 17:39     ` David Marchand
  2019-02-14 18:51       ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-14 17:39 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Wenzhuo Lu, Jingjing Wu, bernard.iremonger

On Thu, Feb 14, 2019 at 5:30 PM Bruce Richardson <bruce.richardson@intel.com>
wrote:

> On Thu, Feb 14, 2019 at 04:42:50PM +0100, David Marchand wrote:
> > pmd can report transmit errors but those stats are not accounted here.
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > ---
> >  app/test-pmd/testpmd.c | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> > index 984155a..3acd97b 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1838,6 +1838,7 @@ struct extmem_param {
> >               total_recv += stats.ipackets;
> >               total_xmit += stats.opackets;
> >               total_rx_dropped += stats.imissed;
> > +             port->tx_dropped += stats.oerrors;
> >               total_tx_dropped += port->tx_dropped;
> >               total_rx_nombuf  += stats.rx_nombuf;
> >
> >
> Without knowing as to whether the line is needed or not, the line itself
> looks out of place. All other lines are assignments to local variables,
> apart from this. Should a local variable be defined for consistency?
>

Indeed this looks wrong to add it to port->tx_dropped.
It actually "works" since this part is called when stopping forwarding and
port->tx_dropped gets reset later when starting forwarding again.

I suppose I should move this to total_tx_dropped instead.

Thanks Bruce.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-14 17:39     ` David Marchand
@ 2019-02-14 18:51       ` David Marchand
  2019-02-15  8:57         ` Thomas Monjalon
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-14 18:51 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: dev, Wenzhuo Lu, Jingjing Wu, bernard.iremonger, Maxime Coquelin

On Thu, Feb 14, 2019 at 6:39 PM David Marchand <david.marchand@redhat.com>
wrote:

> On Thu, Feb 14, 2019 at 5:30 PM Bruce Richardson <
> bruce.richardson@intel.com> wrote:
>
>> On Thu, Feb 14, 2019 at 04:42:50PM +0100, David Marchand wrote:
>> > pmd can report transmit errors but those stats are not accounted here.
>> >
>> > Signed-off-by: David Marchand <david.marchand@redhat.com>
>> > ---
>> >  app/test-pmd/testpmd.c | 1 +
>> >  1 file changed, 1 insertion(+)
>> >
>> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>> > index 984155a..3acd97b 100644
>> > --- a/app/test-pmd/testpmd.c
>> > +++ b/app/test-pmd/testpmd.c
>> > @@ -1838,6 +1838,7 @@ struct extmem_param {
>> >               total_recv += stats.ipackets;
>> >               total_xmit += stats.opackets;
>> >               total_rx_dropped += stats.imissed;
>> > +             port->tx_dropped += stats.oerrors;
>> >               total_tx_dropped += port->tx_dropped;
>> >               total_rx_nombuf  += stats.rx_nombuf;
>> >
>> >
>> Without knowing as to whether the line is needed or not, the line itself
>> looks out of place. All other lines are assignments to local variables,
>> apart from this. Should a local variable be defined for consistency?
>>
>
>
Thinking again about this oerrors stats...

We had a discussion with Maxime, last week.
So I want to make sure that what we both agreed makes sense :-)

What is the purpose of oerrors ?

Since the drivers (via rte_eth_tx_burst return value) report the numbers of
packets successfully transmitted, the application can try to retransmit the
packets that did not make it and counts this.
If the driver counts such "missed" packets, then it does the job the
application will do anyway (wasting some cycles).
But what is more a problem is that the application does not know if the
packets in oerrors are its own retries or problems that the driver can not
detect (hw problems) but the hw can.

So the best option is that oerrors does not report the packets the driver
refuses (and I can see some drivers that do not comply to this) but only
"external" errors from the driver pov.


Back to my patch here, if we agree on this definition of oerrors, I can not
add it to total_tx_dropped, but I suppose I can add some "TX HW errors: "
and "Total TX HW errors: " logs so that we are aware that something went
bad "further" than the driver.


Let's sleep on it :-)

-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-14 18:51       ` David Marchand
@ 2019-02-15  8:57         ` Thomas Monjalon
  2019-02-15  9:33           ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: Thomas Monjalon @ 2019-02-15  8:57 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Bruce Richardson, Wenzhuo Lu, Jingjing Wu,
	bernard.iremonger, Maxime Coquelin, ferruh.yigit, arybchenko

14/02/2019 19:51, David Marchand:
> What is the purpose of oerrors ?
> 
> Since the drivers (via rte_eth_tx_burst return value) report the numbers of
> packets successfully transmitted, the application can try to retransmit the
> packets that did not make it and counts this.
> If the driver counts such "missed" packets, then it does the job the
> application will do anyway (wasting some cycles).
> But what is more a problem is that the application does not know if the
> packets in oerrors are its own retries or problems that the driver can not
> detect (hw problems) but the hw can.
> 
> So the best option is that oerrors does not report the packets the driver
> refuses (and I can see some drivers that do not comply to this) but only
> "external" errors from the driver pov.

I can see the benefit of having driver errors in the stats,
so it is generically stored for later analysis or print.
It could be managed at ethdev level instead of the application
doing the computation.

What about splitting the Tx errors in 2 fields? oerrors / ofull ?
Who said it's awful? sorry Bruce for anticipating ;)

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15  8:57         ` Thomas Monjalon
@ 2019-02-15  9:33           ` David Marchand
  2019-02-15 14:05             ` Bruce Richardson
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-15  9:33 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, Bruce Richardson, Wenzhuo Lu, Jingjing Wu,
	bernard.iremonger, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko

On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon <thomas@monjalon.net> wrote:

> 14/02/2019 19:51, David Marchand:
> > What is the purpose of oerrors ?
> >
> > Since the drivers (via rte_eth_tx_burst return value) report the numbers
> of
> > packets successfully transmitted, the application can try to retransmit
> the
> > packets that did not make it and counts this.
> > If the driver counts such "missed" packets, then it does the job the
> > application will do anyway (wasting some cycles).
> > But what is more a problem is that the application does not know if the
> > packets in oerrors are its own retries or problems that the driver can
> not
> > detect (hw problems) but the hw can.
> >
> > So the best option is that oerrors does not report the packets the driver
> > refuses (and I can see some drivers that do not comply to this) but only
> > "external" errors from the driver pov.
>
> I can see the benefit of having driver errors in the stats,
> so it is generically stored for later analysis or print.
> It could be managed at ethdev level instead of the application
> doing the computation.
>
> What about splitting the Tx errors in 2 fields? oerrors / ofull ?
> Who said it's awful? sorry Bruce for anticipating ;)
>

Summary, correct me if we are not aligned :-)

- ofull (maybe ofifoerrors?) is actually a count of SW failed transmits
- it would be handled in rte_eth_tx_burst() itself in a generic way
- the drivers do not need to track such SW failed transmits
- oerrors only counts packets HW failed transmits, dropped out of the
driver tx_pkt_burst() knowledge
- the application does not have to track SW failed transmits since the
stats is in ethdev

It sounds good to me, this means an ethdev abi breakage.

I will drop my current patch anyway.
Touching oerrors would be a separate effort.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15  9:33           ` David Marchand
@ 2019-02-15 14:05             ` Bruce Richardson
  2019-02-15 14:13               ` Wiles, Keith
  2019-02-15 15:04               ` David Marchand
  0 siblings, 2 replies; 109+ messages in thread
From: Bruce Richardson @ 2019-02-15 14:05 UTC (permalink / raw)
  To: David Marchand
  Cc: Thomas Monjalon, dev, Wenzhuo Lu, Jingjing Wu, bernard.iremonger,
	Maxime Coquelin, Yigit, Ferruh, Andrew Rybchenko

On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
>    On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
>    <[1]thomas@monjalon.net> wrote:
> 
>      14/02/2019 19:51, David Marchand:
>      > What is the purpose of oerrors ?
>      >
>      > Since the drivers (via rte_eth_tx_burst return value) report the
>      numbers of
>      > packets successfully transmitted, the application can try to
>      retransmit the
>      > packets that did not make it and counts this.
>      > If the driver counts such "missed" packets, then it does the job
>      the
>      > application will do anyway (wasting some cycles).
>      > But what is more a problem is that the application does not know
>      if the
>      > packets in oerrors are its own retries or problems that the driver
>      can not
>      > detect (hw problems) but the hw can.
>      >
>      > So the best option is that oerrors does not report the packets the
>      driver
>      > refuses (and I can see some drivers that do not comply to this)
>      but only
>      > "external" errors from the driver pov.
>      I can see the benefit of having driver errors in the stats,
>      so it is generically stored for later analysis or print.
>      It could be managed at ethdev level instead of the application
>      doing the computation.
>      What about splitting the Tx errors in 2 fields? oerrors / ofull ?
>      Who said it's awful? sorry Bruce for anticipating ;)
> 
>    Summary, correct me if we are not aligned :-)
>    - ofull (maybe ofifoerrors?) is actually a count of SW failed transmits
>    - it would be handled in rte_eth_tx_burst() itself in a generic way
>    - the drivers do not need to track such SW failed transmits
>    - oerrors only counts packets HW failed transmits, dropped out of the
>    driver tx_pkt_burst() knowledge
>    - the application does not have to track SW failed transmits since the
>    stats is in ethdev
>    It sounds good to me, this means an ethdev abi breakage.

Hang on, why do we need ethdev to track this at all, given that it's
trivial for apps to track this themselves. Would we not be better just to
add this tracking into testpmd and leave ethdev and drivers alone? Perhaps
I'm missing something?

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 14:05             ` Bruce Richardson
@ 2019-02-15 14:13               ` Wiles, Keith
  2019-02-15 15:04               ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: Wiles, Keith @ 2019-02-15 14:13 UTC (permalink / raw)
  To: Richardson, Bruce
  Cc: David Marchand, Thomas Monjalon, dpdk-dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko



> On Feb 15, 2019, at 8:05 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
> On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
>>   On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
>>   <[1]thomas@monjalon.net> wrote:
>> 
>>     14/02/2019 19:51, David Marchand:
>>> What is the purpose of oerrors ?
>>> 
>>> Since the drivers (via rte_eth_tx_burst return value) report the
>>     numbers of
>>> packets successfully transmitted, the application can try to
>>     retransmit the
>>> packets that did not make it and counts this.
>>> If the driver counts such "missed" packets, then it does the job
>>     the
>>> application will do anyway (wasting some cycles).
>>> But what is more a problem is that the application does not know
>>     if the
>>> packets in oerrors are its own retries or problems that the driver
>>     can not
>>> detect (hw problems) but the hw can.
>>> 
>>> So the best option is that oerrors does not report the packets the
>>     driver
>>> refuses (and I can see some drivers that do not comply to this)
>>     but only
>>> "external" errors from the driver pov.
>>     I can see the benefit of having driver errors in the stats,
>>     so it is generically stored for later analysis or print.
>>     It could be managed at ethdev level instead of the application
>>     doing the computation.
>>     What about splitting the Tx errors in 2 fields? oerrors / ofull ?
>>     Who said it's awful? sorry Bruce for anticipating ;)
>> 
>>   Summary, correct me if we are not aligned :-)
>>   - ofull (maybe ofifoerrors?) is actually a count of SW failed transmits
>>   - it would be handled in rte_eth_tx_burst() itself in a generic way
>>   - the drivers do not need to track such SW failed transmits
>>   - oerrors only counts packets HW failed transmits, dropped out of the
>>   driver tx_pkt_burst() knowledge
>>   - the application does not have to track SW failed transmits since the
>>   stats is in ethdev
>>   It sounds good to me, this means an ethdev abi breakage.
> 
> Hang on, why do we need ethdev to track this at all, given that it's
> trivial for apps to track this themselves. Would we not be better just to
> add this tracking into testpmd and leave ethdev and drivers alone? Perhaps
> I'm missing something?

Adding the counters to ethdev stats is a good idea to me, the number of tx full failures is a great counter as it can tell you a lot about performance of the application. if the ofull counter is high then we have a lot of re-xmit attempts which can point to the problem quicker IMO. Adding it to the PMDs is the right place for this type of information as it is a very common needed counter.
> 

Regards,
Keith

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 14:05             ` Bruce Richardson
  2019-02-15 14:13               ` Wiles, Keith
@ 2019-02-15 15:04               ` David Marchand
  2019-02-15 16:19                 ` Thomas Monjalon
  1 sibling, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-15 15:04 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: Thomas Monjalon, dev, Wenzhuo Lu, Jingjing Wu, bernard.iremonger,
	Maxime Coquelin, Yigit, Ferruh, Andrew Rybchenko

On Fri, Feb 15, 2019 at 3:05 PM Bruce Richardson <bruce.richardson@intel.com>
wrote:

> On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
> >    On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
> >    <[1]thomas@monjalon.net> wrote:
> >
> >      14/02/2019 19:51, David Marchand:
> >      > What is the purpose of oerrors ?
> >      >
> >      > Since the drivers (via rte_eth_tx_burst return value) report the
> >      numbers of
> >      > packets successfully transmitted, the application can try to
> >      retransmit the
> >      > packets that did not make it and counts this.
> >      > If the driver counts such "missed" packets, then it does the job
> >      the
> >      > application will do anyway (wasting some cycles).
> >      > But what is more a problem is that the application does not know
> >      if the
> >      > packets in oerrors are its own retries or problems that the driver
> >      can not
> >      > detect (hw problems) but the hw can.
> >      >
> >      > So the best option is that oerrors does not report the packets the
> >      driver
> >      > refuses (and I can see some drivers that do not comply to this)
> >      but only
> >      > "external" errors from the driver pov.
> >      I can see the benefit of having driver errors in the stats,
> >      so it is generically stored for later analysis or print.
> >      It could be managed at ethdev level instead of the application
> >      doing the computation.
> >      What about splitting the Tx errors in 2 fields? oerrors / ofull ?
> >      Who said it's awful? sorry Bruce for anticipating ;)
> >
> >    Summary, correct me if we are not aligned :-)
> >    - ofull (maybe ofifoerrors?) is actually a count of SW failed
> transmits
> >    - it would be handled in rte_eth_tx_burst() itself in a generic way
> >    - the drivers do not need to track such SW failed transmits
> >    - oerrors only counts packets HW failed transmits, dropped out of the
> >    driver tx_pkt_burst() knowledge
> >    - the application does not have to track SW failed transmits since the
> >    stats is in ethdev
> >    It sounds good to me, this means an ethdev abi breakage.
>
> Hang on, why do we need ethdev to track this at all, given that it's
> trivial for apps to track this themselves. Would we not be better just to
> add this tracking into testpmd and leave ethdev and drivers alone? Perhaps
> I'm missing something?
>

This was my first intention but Thomas hopped in ;-)

testpmd does it already via the fs->fwd_dropped stats and ovs has its
tx_dropped stat.

The problem is that all drivers have different approach about this.
Some drivers only count real hw errors in oerrors.
But others count the packets it can't send in oerrors (+ there are some
cases that seem buggy to me where the driver will always refuse the mbufs
for reason X and the application can retry indefinitely to send...).


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 15:04               ` David Marchand
@ 2019-02-15 16:19                 ` Thomas Monjalon
  2019-02-15 17:32                   ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: Thomas Monjalon @ 2019-02-15 16:19 UTC (permalink / raw)
  To: David Marchand
  Cc: Bruce Richardson, dev, Wenzhuo Lu, Jingjing Wu,
	bernard.iremonger, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, keith.wiles

15/02/2019 16:04, David Marchand:
> On Fri, Feb 15, 2019 at 3:05 PM Bruce Richardson <bruce.richardson@intel.com>
> wrote:
> 
> > On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
> > >    On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
> > >    <[1]thomas@monjalon.net> wrote:
> > >
> > >      14/02/2019 19:51, David Marchand:
> > >      > What is the purpose of oerrors ?
> > >      >
> > >      > Since the drivers (via rte_eth_tx_burst return value) report the
> > >      numbers of
> > >      > packets successfully transmitted, the application can try to
> > >      retransmit the
> > >      > packets that did not make it and counts this.
> > >      > If the driver counts such "missed" packets, then it does the job
> > >      the
> > >      > application will do anyway (wasting some cycles).
> > >      > But what is more a problem is that the application does not know
> > >      if the
> > >      > packets in oerrors are its own retries or problems that the driver
> > >      can not
> > >      > detect (hw problems) but the hw can.
> > >      >
> > >      > So the best option is that oerrors does not report the packets the
> > >      driver
> > >      > refuses (and I can see some drivers that do not comply to this)
> > >      but only
> > >      > "external" errors from the driver pov.
> > >      I can see the benefit of having driver errors in the stats,
> > >      so it is generically stored for later analysis or print.
> > >      It could be managed at ethdev level instead of the application
> > >      doing the computation.
> > >      What about splitting the Tx errors in 2 fields? oerrors / ofull ?
> > >      Who said it's awful? sorry Bruce for anticipating ;)
> > >
> > >    Summary, correct me if we are not aligned :-)
> > >    - ofull (maybe ofifoerrors?) is actually a count of SW failed
> > transmits
> > >    - it would be handled in rte_eth_tx_burst() itself in a generic way
> > >    - the drivers do not need to track such SW failed transmits
> > >    - oerrors only counts packets HW failed transmits, dropped out of the
> > >    driver tx_pkt_burst() knowledge
> > >    - the application does not have to track SW failed transmits since the
> > >    stats is in ethdev
> > >    It sounds good to me, this means an ethdev abi breakage.
> >
> > Hang on, why do we need ethdev to track this at all, given that it's
> > trivial for apps to track this themselves. Would we not be better just to
> > add this tracking into testpmd and leave ethdev and drivers alone? Perhaps
> > I'm missing something?
> >
> 
> This was my first intention but Thomas hopped in ;-)

I was just opening the discussion :)

> testpmd does it already via the fs->fwd_dropped stats and ovs has its
> tx_dropped stat.
> 
> The problem is that all drivers have different approach about this.
> Some drivers only count real hw errors in oerrors.
> But others count the packets it can't send in oerrors (+ there are some
> cases that seem buggy to me where the driver will always refuse the mbufs
> for reason X and the application can retry indefinitely to send...).

We have 3 options:
1/ status quo = oerrors is inconsistent across drivers
2/ API break = oerrors stop being incremented for temporary
	unavailability (i.e. queue full, kind of ERETRY),
	report only packets which will be never sent,
	may be a small performance gain for some drivers
3/ API + ABI break = same as 2/ +
	report ERETRY errors in ofull (same as tx_burst() delta)

Note that the option 2 is a light API break which does not require
any deprecation notice because the original definition of oerrors
is really vague: "failed transmitted packets"
By changing the definition of errors to "packets lost", we can count
HW errors + packets not matching requirements.
As David suggests, the packets not matching requirements can be freed
as it is done for packets successfully transmitted to the HW.
We need also to update the definition of the return value of
rte_eth_tx_burst(): "packets actually stored in transmit descriptors".
We should also count the bad packets rejected by the driver.
Then the number of bad packets would be the difference between
the return value of rte_eth_tx_burst() and opackets counter.
This solution is fixing some bugs and enforce a consistent behaviour.

The option 3 is breaking the ABI and may degrade the performances.
The only benefit is convenience or semantic: ofull would be the
equivalent of imissed.
The application can count the same by making the difference between
the burst size and the return of rte_eth_tx_burst.

My vote is for the option 2.

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 16:19                 ` Thomas Monjalon
@ 2019-02-15 17:32                   ` David Marchand
  2019-02-15 18:15                     ` Ananyev, Konstantin
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-15 17:32 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Bruce Richardson, dev, Wenzhuo Lu, Jingjing Wu,
	bernard.iremonger, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, keith.wiles

On Fri, Feb 15, 2019 at 5:19 PM Thomas Monjalon <thomas@monjalon.net> wrote:

> 15/02/2019 16:04, David Marchand:
> > On Fri, Feb 15, 2019 at 3:05 PM Bruce Richardson <
> bruce.richardson@intel.com>
> > wrote:
> >
> > > On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
> > > >    On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
> > > >    <[1]thomas@monjalon.net> wrote:
> > > >
> > > >      14/02/2019 19:51, David Marchand:
> > > >      > What is the purpose of oerrors ?
> > > >      >
> > > >      > Since the drivers (via rte_eth_tx_burst return value) report
> the
> > > >      numbers of
> > > >      > packets successfully transmitted, the application can try to
> > > >      retransmit the
> > > >      > packets that did not make it and counts this.
> > > >      > If the driver counts such "missed" packets, then it does the
> job
> > > >      the
> > > >      > application will do anyway (wasting some cycles).
> > > >      > But what is more a problem is that the application does not
> know
> > > >      if the
> > > >      > packets in oerrors are its own retries or problems that the
> driver
> > > >      can not
> > > >      > detect (hw problems) but the hw can.
> > > >      >
> > > >      > So the best option is that oerrors does not report the
> packets the
> > > >      driver
> > > >      > refuses (and I can see some drivers that do not comply to
> this)
> > > >      but only
> > > >      > "external" errors from the driver pov.
> > > >      I can see the benefit of having driver errors in the stats,
> > > >      so it is generically stored for later analysis or print.
> > > >      It could be managed at ethdev level instead of the application
> > > >      doing the computation.
> > > >      What about splitting the Tx errors in 2 fields? oerrors / ofull
> ?
> > > >      Who said it's awful? sorry Bruce for anticipating ;)
> > > >
> > > >    Summary, correct me if we are not aligned :-)
> > > >    - ofull (maybe ofifoerrors?) is actually a count of SW failed
> > > transmits
> > > >    - it would be handled in rte_eth_tx_burst() itself in a generic
> way
> > > >    - the drivers do not need to track such SW failed transmits
> > > >    - oerrors only counts packets HW failed transmits, dropped out of
> the
> > > >    driver tx_pkt_burst() knowledge
> > > >    - the application does not have to track SW failed transmits
> since the
> > > >    stats is in ethdev
> > > >    It sounds good to me, this means an ethdev abi breakage.
> > >
> > > Hang on, why do we need ethdev to track this at all, given that it's
> > > trivial for apps to track this themselves. Would we not be better just
> to
> > > add this tracking into testpmd and leave ethdev and drivers alone?
> Perhaps
> > > I'm missing something?
> > >
> >
> > This was my first intention but Thomas hopped in ;-)
>
> I was just opening the discussion :)
>
> > testpmd does it already via the fs->fwd_dropped stats and ovs has its
> > tx_dropped stat.
> >
> > The problem is that all drivers have different approach about this.
> > Some drivers only count real hw errors in oerrors.
> > But others count the packets it can't send in oerrors (+ there are some
> > cases that seem buggy to me where the driver will always refuse the mbufs
> > for reason X and the application can retry indefinitely to send...).
>
> We have 3 options:
> 1/ status quo = oerrors is inconsistent across drivers
> 2/ API break = oerrors stop being incremented for temporary
>         unavailability (i.e. queue full, kind of ERETRY),
>         report only packets which will be never sent,
>         may be a small performance gain for some drivers
> 3/ API + ABI break = same as 2/ +
>         report ERETRY errors in ofull (same as tx_burst() delta)
>
> Note that the option 2 is a light API break which does not require
> any deprecation notice because the original definition of oerrors
> is really vague: "failed transmitted packets"
> By changing the definition of errors to "packets lost", we can count
> HW errors + packets not matching requirements.
> As David suggests, the packets not matching requirements can be freed
> as it is done for packets successfully transmitted to the HW.
> We need also to update the definition of the return value of
> rte_eth_tx_burst(): "packets actually stored in transmit descriptors".
> We should also count the bad packets rejected by the driver.
> Then the number of bad packets would be the difference between
> the return value of rte_eth_tx_burst() and opackets counter.
> This solution is fixing some bugs and enforce a consistent behaviour.
>

I am also for option 2 especially because of this.
A driver that refuses a packet for reason X (which is a limitation, or an
incorrect config or whatever that is not a transient condition) but gives
it back to the application is a bad driver.


> The option 3 is breaking the ABI and may degrade the performances.
> The only benefit is convenience or semantic: ofull would be the
> equivalent of imissed.
> The application can count the same by making the difference between
> the burst size and the return of rte_eth_tx_burst.
>
> My vote is for the option 2.
>



-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 17:32                   ` David Marchand
@ 2019-02-15 18:15                     ` Ananyev, Konstantin
  2019-02-15 18:31                       ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: Ananyev, Konstantin @ 2019-02-15 18:15 UTC (permalink / raw)
  To: David Marchand, Thomas Monjalon
  Cc: Richardson, Bruce, dev, Lu, Wenzhuo, Wu, Jingjing, Iremonger,
	Bernard, Maxime Coquelin, Yigit, Ferruh, Andrew Rybchenko, Wiles,
	Keith



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> Sent: Friday, February 15, 2019 5:32 PM
> To: Thomas Monjalon <thomas@monjalon.net>
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; dev@dpdk.org; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Iremonger, Bernard <bernard.iremonger@intel.com>; Maxime Coquelin <mcoqueli@redhat.com>; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Andrew Rybchenko <arybchenko@solarflare.com>; Wiles, Keith <keith.wiles@intel.com>
> Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
> 
> On Fri, Feb 15, 2019 at 5:19 PM Thomas Monjalon <thomas@monjalon.net> wrote:
> 
> > 15/02/2019 16:04, David Marchand:
> > > On Fri, Feb 15, 2019 at 3:05 PM Bruce Richardson <
> > bruce.richardson@intel.com>
> > > wrote:
> > >
> > > > On Fri, Feb 15, 2019 at 10:33:47AM +0100, David Marchand wrote:
> > > > >    On Fri, Feb 15, 2019 at 9:58 AM Thomas Monjalon
> > > > >    <[1]thomas@monjalon.net> wrote:
> > > > >
> > > > >      14/02/2019 19:51, David Marchand:
> > > > >      > What is the purpose of oerrors ?
> > > > >      >
> > > > >      > Since the drivers (via rte_eth_tx_burst return value) report
> > the
> > > > >      numbers of
> > > > >      > packets successfully transmitted, the application can try to
> > > > >      retransmit the
> > > > >      > packets that did not make it and counts this.
> > > > >      > If the driver counts such "missed" packets, then it does the
> > job
> > > > >      the
> > > > >      > application will do anyway (wasting some cycles).
> > > > >      > But what is more a problem is that the application does not
> > know
> > > > >      if the
> > > > >      > packets in oerrors are its own retries or problems that the
> > driver
> > > > >      can not
> > > > >      > detect (hw problems) but the hw can.
> > > > >      >
> > > > >      > So the best option is that oerrors does not report the
> > packets the
> > > > >      driver
> > > > >      > refuses (and I can see some drivers that do not comply to
> > this)
> > > > >      but only
> > > > >      > "external" errors from the driver pov.
> > > > >      I can see the benefit of having driver errors in the stats,
> > > > >      so it is generically stored for later analysis or print.
> > > > >      It could be managed at ethdev level instead of the application
> > > > >      doing the computation.
> > > > >      What about splitting the Tx errors in 2 fields? oerrors / ofull
> > ?
> > > > >      Who said it's awful? sorry Bruce for anticipating ;)
> > > > >
> > > > >    Summary, correct me if we are not aligned :-)
> > > > >    - ofull (maybe ofifoerrors?) is actually a count of SW failed
> > > > transmits
> > > > >    - it would be handled in rte_eth_tx_burst() itself in a generic
> > way
> > > > >    - the drivers do not need to track such SW failed transmits
> > > > >    - oerrors only counts packets HW failed transmits, dropped out of
> > the
> > > > >    driver tx_pkt_burst() knowledge
> > > > >    - the application does not have to track SW failed transmits
> > since the
> > > > >    stats is in ethdev
> > > > >    It sounds good to me, this means an ethdev abi breakage.
> > > >
> > > > Hang on, why do we need ethdev to track this at all, given that it's
> > > > trivial for apps to track this themselves. Would we not be better just
> > to
> > > > add this tracking into testpmd and leave ethdev and drivers alone?
> > Perhaps
> > > > I'm missing something?
> > > >
> > >
> > > This was my first intention but Thomas hopped in ;-)
> >
> > I was just opening the discussion :)
> >
> > > testpmd does it already via the fs->fwd_dropped stats and ovs has its
> > > tx_dropped stat.
> > >
> > > The problem is that all drivers have different approach about this.
> > > Some drivers only count real hw errors in oerrors.
> > > But others count the packets it can't send in oerrors (+ there are some
> > > cases that seem buggy to me where the driver will always refuse the mbufs
> > > for reason X and the application can retry indefinitely to send...).
> >
> > We have 3 options:
> > 1/ status quo = oerrors is inconsistent across drivers
> > 2/ API break = oerrors stop being incremented for temporary
> >         unavailability (i.e. queue full, kind of ERETRY),
> >         report only packets which will be never sent,
> >         may be a small performance gain for some drivers
> > 3/ API + ABI break = same as 2/ +
> >         report ERETRY errors in ofull (same as tx_burst() delta)
> >
> > Note that the option 2 is a light API break which does not require
> > any deprecation notice because the original definition of oerrors
> > is really vague: "failed transmitted packets"
> > By changing the definition of errors to "packets lost", we can count
> > HW errors + packets not matching requirements.
> > As David suggests, the packets not matching requirements can be freed
> > as it is done for packets successfully transmitted to the HW.
> > We need also to update the definition of the return value of
> > rte_eth_tx_burst(): "packets actually stored in transmit descriptors".
> > We should also count the bad packets rejected by the driver.
> > Then the number of bad packets would be the difference between
> > the return value of rte_eth_tx_burst() and opackets counter.
> > This solution is fixing some bugs and enforce a consistent behaviour.
> >
> 
> I am also for option 2 especially because of this.
> A driver that refuses a packet for reason X (which is a limitation, or an
> incorrect config or whatever that is not a transient condition) but gives
> it back to the application is a bad driver.

Why? What.s wrong to leave it to the upper layer to decide what to
do with the packets that can't be sent (by one reason or another)?

> 
> 
> > The option 3 is breaking the ABI and may degrade the performances.
> > The only benefit is convenience or semantic: ofull would be the
> > equivalent of imissed.
> > The application can count the same by making the difference between
> > the burst size and the return of rte_eth_tx_burst.
> >
> > My vote is for the option 2.
> >
> 
> 
> 
> --
> David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 18:15                     ` Ananyev, Konstantin
@ 2019-02-15 18:31                       ` David Marchand
  2019-02-15 18:42                         ` Ananyev, Konstantin
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-15 18:31 UTC (permalink / raw)
  To: Ananyev, Konstantin
  Cc: Thomas Monjalon, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith

On Fri, Feb 15, 2019 at 7:15 PM Ananyev, Konstantin <
konstantin.ananyev@intel.com> wrote:

> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> > I am also for option 2 especially because of this.
> > A driver that refuses a packet for reason X (which is a limitation, or an
> > incorrect config or whatever that is not a transient condition) but gives
> > it back to the application is a bad driver.
>
> Why? What.s wrong to leave it to the upper layer to decide what to
> do with the packets that can't be sent (by one reason or another)?
>

How does the upper layer know if this is a transient state or something
that can't be resolved?


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 18:31                       ` David Marchand
@ 2019-02-15 18:42                         ` Ananyev, Konstantin
  2019-02-15 19:38                           ` Thomas Monjalon
  0 siblings, 1 reply; 109+ messages in thread
From: Ananyev, Konstantin @ 2019-02-15 18:42 UTC (permalink / raw)
  To: David Marchand
  Cc: Thomas Monjalon, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith

>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
>>> I am also for option 2 especially because of this.
>>> A driver that refuses a packet for reason X (which is a limitation, or an
>>> incorrect config or whatever that is not a transient condition) but gives
>>> it back to the application is a bad driver.

>>Why? What.s wrong to leave it to the upper layer to decide what to
>>do with the packets that can't be sent (by one reason or another)?

>How does the upper layer know if this is a transient state or something that can't be resolved?

Via rte_errno, for example.

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 18:42                         ` Ananyev, Konstantin
@ 2019-02-15 19:38                           ` Thomas Monjalon
  2019-02-16  0:37                             ` Stephen Hemminger
  2019-02-16 12:50                             ` Ananyev, Konstantin
  0 siblings, 2 replies; 109+ messages in thread
From: Thomas Monjalon @ 2019-02-15 19:38 UTC (permalink / raw)
  To: Ananyev, Konstantin
  Cc: David Marchand, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith

15/02/2019 19:42, Ananyev, Konstantin:
> >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> >>> I am also for option 2 especially because of this.
> >>> A driver that refuses a packet for reason X (which is a limitation, or an
> >>> incorrect config or whatever that is not a transient condition) but gives
> >>> it back to the application is a bad driver.
> 
> >>Why? What.s wrong to leave it to the upper layer to decide what to
> >>do with the packets that can't be sent (by one reason or another)?
> 
> >How does the upper layer know if this is a transient state or something that can't be resolved?
> 
> Via rte_errno, for example.

rte_errno is not a result per packet.
I think it is better to "eat" the packet
as it is done for those transmitted to the HW.

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 19:38                           ` Thomas Monjalon
@ 2019-02-16  0:37                             ` Stephen Hemminger
  2019-02-16 13:23                               ` Ananyev, Konstantin
  2019-02-16 12:50                             ` Ananyev, Konstantin
  1 sibling, 1 reply; 109+ messages in thread
From: Stephen Hemminger @ 2019-02-16  0:37 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Ananyev, Konstantin, David Marchand, Richardson, Bruce, dev, Lu,
	Wenzhuo, Wu, Jingjing, Iremonger, Bernard, Maxime Coquelin,
	Yigit, Ferruh, Andrew Rybchenko, Wiles, Keith

On Fri, 15 Feb 2019 20:38:59 +0100
Thomas Monjalon <thomas@monjalon.net> wrote:

> 15/02/2019 19:42, Ananyev, Konstantin:
> > >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> > >>> I am also for option 2 especially because of this.
> > >>> A driver that refuses a packet for reason X (which is a limitation, or an
> > >>> incorrect config or whatever that is not a transient condition) but gives
> > >>> it back to the application is a bad driver.  
> >   
> > >>Why? What.s wrong to leave it to the upper layer to decide what to
> > >>do with the packets that can't be sent (by one reason or another)?  
> >   
> > >How does the upper layer know if this is a transient state or something that can't be resolved?  
> > 
> > Via rte_errno, for example.  
> 
> rte_errno is not a result per packet.
> I think it is better to "eat" the packet
> as it is done for those transmitted to the HW.
> 
> 

First off rte_errno doesn't work for a burst API.

IMHO (which matches /2) all drivers should only increment oerrors for something for
a packet which it could not transmit because of hardware condition (link down etc)
or mbuf which has parameters which can not be handled. In either case, the packet
must be dropped by driver and oerrors incremented.  The driver should also maintain
internal stats (available by xstats) for any conditions like this.

When no tx descriptors are available, the driver must not increment any counter
and return partial success to the application. If application then wants to do
back pressure or drop it should keep its own statistics.

This is close to the original model in the Intel drivers, and matches what BSD and
Linux do on the OS level for drivers. Like many driver assumptions the corner
cases were not explicitly documented and new drivers probably don't follow
the same pattern.

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-15 19:38                           ` Thomas Monjalon
  2019-02-16  0:37                             ` Stephen Hemminger
@ 2019-02-16 12:50                             ` Ananyev, Konstantin
  2019-02-20  8:33                               ` David Marchand
  1 sibling, 1 reply; 109+ messages in thread
From: Ananyev, Konstantin @ 2019-02-16 12:50 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: David Marchand, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Friday, February 15, 2019 7:39 PM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> Cc: David Marchand <david.marchand@redhat.com>; Richardson, Bruce <bruce.richardson@intel.com>; dev@dpdk.org; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Iremonger, Bernard <bernard.iremonger@intel.com>; Maxime Coquelin
> <mcoqueli@redhat.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew Rybchenko <arybchenko@solarflare.com>; Wiles, Keith
> <keith.wiles@intel.com>
> Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
> 
> 15/02/2019 19:42, Ananyev, Konstantin:
> > >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> > >>> I am also for option 2 especially because of this.
> > >>> A driver that refuses a packet for reason X (which is a limitation, or an
> > >>> incorrect config or whatever that is not a transient condition) but gives
> > >>> it back to the application is a bad driver.
> >
> > >>Why? What.s wrong to leave it to the upper layer to decide what to
> > >>do with the packets that can't be sent (by one reason or another)?
> >
> > >How does the upper layer know if this is a transient state or something that can't be resolved?
> >
> > Via rte_errno, for example.
> 
> rte_errno is not a result per packet.

Surely it is not.
But tx_burst() can return after first failure.

> I think it is better to "eat" the packet
> as it is done for those transmitted to the HW.

Probably extra clarification is needed here.
Right now tx_burst (at least for PMDs I am aware about) doesn't
do any checking that:
-  packet is correct and can be handled
   (this is responsibility of tx_prepare)
- HW/PMD SW state is in valid and properly configured  
  (link is up, queue is configured, HW initialized properly).

All that really tx_burst() care about -there is enough free TX
descriptors to fill. When that happens - tx_burst() returns 
straightway.

So what particular error conditions are you talking about,
and when you think we have to 'eat' the packets?
Konstantin



 

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-16  0:37                             ` Stephen Hemminger
@ 2019-02-16 13:23                               ` Ananyev, Konstantin
  0 siblings, 0 replies; 109+ messages in thread
From: Ananyev, Konstantin @ 2019-02-16 13:23 UTC (permalink / raw)
  To: Stephen Hemminger, Thomas Monjalon
  Cc: David Marchand, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith


> 
> On Fri, 15 Feb 2019 20:38:59 +0100
> Thomas Monjalon <thomas@monjalon.net> wrote:
> 
> > 15/02/2019 19:42, Ananyev, Konstantin:
> > > >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David Marchand
> > > >>> I am also for option 2 especially because of this.
> > > >>> A driver that refuses a packet for reason X (which is a limitation, or an
> > > >>> incorrect config or whatever that is not a transient condition) but gives
> > > >>> it back to the application is a bad driver.
> > >
> > > >>Why? What.s wrong to leave it to the upper layer to decide what to
> > > >>do with the packets that can't be sent (by one reason or another)?
> > >
> > > >How does the upper layer know if this is a transient state or something that can't be resolved?
> > >
> > > Via rte_errno, for example.
> >
> > rte_errno is not a result per packet.
> > I think it is better to "eat" the packet
> > as it is done for those transmitted to the HW.
> >
> >
> 
> First off rte_errno doesn't work for a burst API.

It doesn't allow to return individual error value for each packet.
Though if we stop after first error happens - it is sufficient.

> 
> IMHO (which matches /2) all drivers should only increment oerrors for something for
> a packet which it could not transmit because of hardware condition (link down etc)

It sounds too expensive to check that HW is in healthy state and link is up for every tx_burst
operation. 

> or mbuf which has parameters which can not be handled.

Right now it is responsibility of different function - tx_prepare().

> In either case, the packet
> must be dropped by driver and oerrors incremented.  

Right now tx_burst() only cares - is there enough free TX descriptors to submit packet or not.
>From my perspective - it is better to keep it that way.
If the user would like to drop packets if the link is down,
or if the packet is malformed -  there should be no problem to create a wrapper on
top of tx_burst() that would do all these extra checking and packet freeing.

>The driver should also maintain
> internal stats (available by xstats) for any conditions like this.
> 
> When no tx descriptors are available, the driver must not increment any counter
> and return partial success to the application. If application then wants to do
> back pressure or drop it should keep its own statistics.
> 
> This is close to the original model in the Intel drivers, and matches what BSD and
> Linux do on the OS level for drivers. Like many driver assumptions the corner
> cases were not explicitly documented and new drivers probably don't follow
> the same pattern.

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

* Re: [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field David Marchand
@ 2019-02-18 19:55   ` Rami Rosen
  0 siblings, 0 replies; 109+ messages in thread
From: Rami Rosen @ 2019-02-18 19:55 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, wenzhuo.lu, jingjing.wu, Iremonger, Bernard

I believe this patch should be cc'ed/sent to stable@dpdk.org

Reviewed-by: Rami Rosen <ramirose@gmail.com>

On Thu, Feb 14, 2019 at 5:43 PM David Marchand <david.marchand@redhat.com>
wrote:

> Remove some leftover from a previous rework.
>
> Fixes: c4bcc342c8ee ("app/testpmd: refactor ieee1588 forwarding")
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
>  app/test-pmd/testpmd.h | 1 -
>  1 file changed, 1 deletion(-)
>
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
> index fa48878..85b791b 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -173,7 +173,6 @@ struct rte_port {
>         uint16_t                tunnel_tso_segsz; /**< Segmentation
> offload MSS for tunneled pkts. */
>         uint16_t                tx_vlan_id;/**< The tag ID */
>         uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
> -       void                    *fwd_ctx;   /**< Forwarding mode context */
>         uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip
> checksum  */
>         uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4
> checksum */
>         uint64_t                rx_bad_outer_l4_csum;
> --
> 1.8.3.1
>
>

-- 
regards,
Rami Rosen

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

* Re: [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-02-19  5:48   ` Rami Rosen
  0 siblings, 0 replies; 109+ messages in thread
From: Rami Rosen @ 2019-02-19  5:48 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, wenzhuo.lu, jingjing.wu, Iremonger, Bernard

+1
Reviewed-by: Rami Rosen <ramirose at gmail.com>

On Thu, Feb 14, 2019 at 5:43 PM David Marchand <david.marchand@redhat.com>
wrote:

> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>   RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6
>          RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>   TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>   RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>   RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>   TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
>  app/test-pmd/testpmd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 98c1baa..984155a 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>                "TX Port=%2d/Queue=%2d %s\n",
>                fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>                fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -       printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +       printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>                fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>
>         /* if checksum mode */
> --
> 1.8.3.1
>
>

-- 
regards,
Rami Rosen

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-16 12:50                             ` Ananyev, Konstantin
@ 2019-02-20  8:33                               ` David Marchand
  2019-02-24 11:55                                 ` Ananyev, Konstantin
  0 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-02-20  8:33 UTC (permalink / raw)
  To: Ananyev, Konstantin
  Cc: Thomas Monjalon, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith

Hello Konstantin,

On Sat, Feb 16, 2019 at 1:50 PM Ananyev, Konstantin <
konstantin.ananyev@intel.com> wrote:

>
>
> > -----Original Message-----
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Friday, February 15, 2019 7:39 PM
> > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>
> > Cc: David Marchand <david.marchand@redhat.com>; Richardson, Bruce <
> bruce.richardson@intel.com>; dev@dpdk.org; Lu, Wenzhuo
> > <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>;
> Iremonger, Bernard <bernard.iremonger@intel.com>; Maxime Coquelin
> > <mcoqueli@redhat.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> Rybchenko <arybchenko@solarflare.com>; Wiles, Keith
> > <keith.wiles@intel.com>
> > Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit
> errors stats
> >
> > 15/02/2019 19:42, Ananyev, Konstantin:
> > > >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of David
> Marchand
> > > >>> I am also for option 2 especially because of this.
> > > >>> A driver that refuses a packet for reason X (which is a
> limitation, or an
> > > >>> incorrect config or whatever that is not a transient condition)
> but gives
> > > >>> it back to the application is a bad driver.
> > >
> > > >>Why? What.s wrong to leave it to the upper layer to decide what to
> > > >>do with the packets that can't be sent (by one reason or another)?
> > >
> > > >How does the upper layer know if this is a transient state or
> something that can't be resolved?
> > >
> > > Via rte_errno, for example.
> >
> > rte_errno is not a result per packet.
>
> Surely it is not.
> But tx_burst() can return after first failure.
>
> > I think it is better to "eat" the packet
> > as it is done for those transmitted to the HW.
>
> Probably extra clarification is needed here.
> Right now tx_burst (at least for PMDs I am aware about) doesn't
> do any checking that:
> -  packet is correct and can be handled
>    (this is responsibility of tx_prepare)
> - HW/PMD SW state is in valid and properly configured
>   (link is up, queue is configured, HW initialized properly).
>
> All that really tx_burst() care about -there is enough free TX
> descriptors to fill. When that happens - tx_burst() returns
> straightway.
>
> So what particular error conditions are you talking about,
> and when you think we have to 'eat' the packets?
>

- This is how Intel drivers are written yes.
But some drivers try to do more and have (useless ?) checks on mbufs or
internal states.

Found the following ones last week.
There are more but it takes time to investigate.
https://git.dpdk.org/dpdk/tree/drivers/net/atlantic/atl_rxtx.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n1346
https://git.dpdk.org/dpdk/tree/drivers/net/fm10k/fm10k_rxtx.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n646
https://git.dpdk.org/dpdk/tree/drivers/net/cxgbe/sge.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n1123

I would say first, we can have a cleanup to get rid of the unneeded checks,
and see what the different maintainers think about this.
Then look again at the situation.


- I will drop this patch on testpmd which was wrong.
But I intend to send an update on the doc to describe oerrors as solution 2:
2/ API break = oerrors stop being incremented for temporary
        unavailability (i.e. queue full, kind of ERETRY),
        report only packets which will be never sent,
        may be a small performance gain for some drivers

There is some cleanup to do as well in quite a few drivers.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
  2019-02-20  8:33                               ` David Marchand
@ 2019-02-24 11:55                                 ` Ananyev, Konstantin
  0 siblings, 0 replies; 109+ messages in thread
From: Ananyev, Konstantin @ 2019-02-24 11:55 UTC (permalink / raw)
  To: David Marchand
  Cc: Thomas Monjalon, Richardson, Bruce, dev, Lu, Wenzhuo, Wu,
	Jingjing, Iremonger, Bernard, Maxime Coquelin, Yigit, Ferruh,
	Andrew Rybchenko, Wiles, Keith

Hi David,


Hello Konstantin,

On Sat, Feb 16, 2019 at 1:50 PM Ananyev, Konstantin <konstantin.ananyev@intel.com<mailto:konstantin.ananyev@intel.com>> wrote:


> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net<mailto:thomas@monjalon.net>]
> Sent: Friday, February 15, 2019 7:39 PM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com<mailto:konstantin.ananyev@intel.com>>
> Cc: David Marchand <david.marchand@redhat.com<mailto:david.marchand@redhat.com>>; Richardson, Bruce <bruce.richardson@intel.com<mailto:bruce.richardson@intel.com>>; dev@dpdk.org<mailto:dev@dpdk.org>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com<mailto:wenzhuo.lu@intel.com>>; Wu, Jingjing <jingjing.wu@intel.com<mailto:jingjing.wu@intel.com>>; Iremonger, Bernard <bernard.iremonger@intel.com<mailto:bernard.iremonger@intel.com>>; Maxime Coquelin
> <mcoqueli@redhat.com<mailto:mcoqueli@redhat.com>>; Yigit, Ferruh <ferruh.yigit@intel.com<mailto:ferruh.yigit@intel.com>>; Andrew Rybchenko <arybchenko@solarflare.com<mailto:arybchenko@solarflare.com>>; Wiles, Keith
> <keith.wiles@intel.com<mailto:keith.wiles@intel.com>>
> Subject: Re: [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats
>
> 15/02/2019 19:42, Ananyev, Konstantin:
> > >>> From: dev [mailto:dev-bounces@dpdk.org<mailto:dev-bounces@dpdk.org>] On Behalf Of David Marchand
> > >>> I am also for option 2 especially because of this.
> > >>> A driver that refuses a packet for reason X (which is a limitation, or an
> > >>> incorrect config or whatever that is not a transient condition) but gives
> > >>> it back to the application is a bad driver.
> >
> > >>Why? What.s wrong to leave it to the upper layer to decide what to
> > >>do with the packets that can't be sent (by one reason or another)?
> >
> > >How does the upper layer know if this is a transient state or something that can't be resolved?
> >
> > Via rte_errno, for example.
>
> rte_errno is not a result per packet.

Surely it is not.
But tx_burst() can return after first failure.

> I think it is better to "eat" the packet
> as it is done for those transmitted to the HW.

Probably extra clarification is needed here.
Right now tx_burst (at least for PMDs I am aware about) doesn't
do any checking that:
-  packet is correct and can be handled
   (this is responsibility of tx_prepare)
- HW/PMD SW state is in valid and properly configured
  (link is up, queue is configured, HW initialized properly).

All that really tx_burst() care about -there is enough free TX
descriptors to fill. When that happens - tx_burst() returns
straightway.

So what particular error conditions are you talking about,
and when you think we have to 'eat' the packets?

- This is how Intel drivers are written yes.
But some drivers try to do more and have (useless ?) checks on mbufs or internal states.

Found the following ones last week.
There are more but it takes time to investigate.
https://git.dpdk.org/dpdk/tree/drivers/net/atlantic/atl_rxtx.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n1346
https://git.dpdk.org/dpdk/tree/drivers/net/fm10k/fm10k_rxtx.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n646
https://git.dpdk.org/dpdk/tree/drivers/net/cxgbe/sge.c?id=b13baac8d5ffb6b0b7a6ca0def884d3f1a82babb#n1123

I would say first, we can have a cleanup to get rid of the unneeded checks, and see what the different maintainers think about this.
Then look again at the situation.


- I will drop this patch on testpmd which was wrong.
But I intend to send an update on the doc to describe oerrors as solution 2:
2/ API break = oerrors stop being incremented for temporary
        unavailability (i.e. queue full, kind of ERETRY),
        report only packets which will be never sent,
        may be a small performance gain for some drivers

There is some cleanup to do as well in quite a few drivers.

I didn’t look at all your links above, but fm10k checks definitely seems redundant.
Cleanup of such things sounds like a good thing.
Thanks
Konstantin

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

* [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly
  2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
                   ` (4 preceding siblings ...)
  2019-02-14 15:42 ` [dpdk-dev] [PATCH 5/5] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-11 15:35 ` David Marchand
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field David Marchand
                     ` (4 more replies)
  5 siblings, 5 replies; 109+ messages in thread
From: David Marchand @ 2019-03-11 15:35 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---
David Marchand (4):
  app/testpmd: remove unused fwd_ctx field
  app/testpmd: add missing newline when showing statistics
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 450 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  22 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 315 insertions(+), 237 deletions(-)

-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
@ 2019-03-11 15:35   ` David Marchand
  2019-03-19 18:29     ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics David Marchand
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-11 15:35 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

Remove some leftover from a previous rework.

Fixes: c4bcc342c8ee ("app/testpmd: refactor ieee1588 forwarding")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
---
Changelog since v1:
- added Cc: stable

---
 app/test-pmd/testpmd.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index fa48878..85b791b 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -173,7 +173,6 @@ struct rte_port {
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	void                    *fwd_ctx;   /**< Forwarding mode context */
 	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
 	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
 	uint64_t                rx_bad_outer_l4_csum;
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field David Marchand
@ 2019-03-11 15:35   ` David Marchand
  2019-03-11 15:53     ` Andrew Rybchenko
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics David Marchand
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-11 15:35 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 98c1baa..984155a 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field David Marchand
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-11 15:35   ` David Marchand
  2019-03-11 15:57     ` Andrew Rybchenko
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
  4 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-11 15:35 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

Caught by code review while investigating the stats display code.
Switching all port and fwd engine statistics to uint64_t makes it
possible to drop all casts.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/testpmd.c | 62 ++++++++++++++++++--------------------------------
 app/test-pmd/testpmd.h | 12 +++++-----
 2 files changed, 28 insertions(+), 46 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 984155a..3651a13 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,42 +1771,25 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
+		fwd_cycles += fs->core_cycles;
 #endif
 	}
 	total_recv = 0;
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v2 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
                     ` (2 preceding siblings ...)
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-11 15:35   ` David Marchand
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
  4 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-11 15:35 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, rte_port can't be used to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 424 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 305 insertions(+), 208 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index db53cc0..58b11b7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7386,6 +7386,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_fwd_parsed(void *parsed_result,
+	       __rte_unused struct cmdline *cl,
+	       __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_fwdall = {
+	.f = cmd_fwd_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_fwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 3651a13..02895e5 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1766,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1816,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1845,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,86 +1866,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles += fs->core_cycles;
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1

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

* Re: [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-11 15:53     ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-11 15:53 UTC (permalink / raw)
  To: David Marchand, dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

On 3/11/19 6:35 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
> ---
>   app/test-pmd/testpmd.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 98c1baa..984155a 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>   	       "TX Port=%2d/Queue=%2d %s\n",
>   	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>   	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>   	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>   
>   	/* if checksum mode */

I'd suggest to add Fixes tag since it looks like a bug
Rx burst stats should be printed on its own line regardless
Rx checksum stats printed or skipped.

Fixes: af75078fece3 ("first public release")

Andrew.

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

* Re: [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-11 15:57     ` Andrew Rybchenko
  2019-03-11 16:03       ` David Marchand
  0 siblings, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-11 15:57 UTC (permalink / raw)
  To: David Marchand, dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose

On 3/11/19 6:35 PM, David Marchand wrote:
> Caught by code review while investigating the stats display code.
> Switching all port and fwd engine statistics to uint64_t makes it
> possible to drop all casts.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Patch summary is misleading here. The main change here is changing
of counters bitwidth. 32-bit counters overflow pretty fast on 100G, so
it is a good idea to fix it.

Andrew.

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

* Re: [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics
  2019-03-11 15:57     ` Andrew Rybchenko
@ 2019-03-11 16:03       ` David Marchand
  0 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-11 16:03 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen

On Mon, Mar 11, 2019 at 4:57 PM Andrew Rybchenko <arybchenko@solarflare.com>
wrote:

> On 3/11/19 6:35 PM, David Marchand wrote:
>
> Caught by code review while investigating the stats display code.
> Switching all port and fwd engine statistics to uint64_t makes it
> possible to drop all casts.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com> <david.marchand@redhat.com>
>
>
> Patch summary is misleading here. The main change here is changing
> of counters bitwidth. 32-bit counters overflow pretty fast on 100G, so
> it is a good idea to fix it.
>
>
Oops, I was so focused on the casts and had in mind "unsigned int" was 64
bits wide...
Will reword and this will deserve a Fixes: tag.

Thanks for catching.

-- 
David Marchand

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

* Re: [dpdk-dev] [dpdk-stable] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field David Marchand
@ 2019-03-19 18:29     ` Ferruh Yigit
  2019-03-19 18:29       ` Ferruh Yigit
  0 siblings, 1 reply; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-19 18:29 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/11/2019 3:35 PM, David Marchand wrote:
> Remove some leftover from a previous rework.
> 
> Fixes: c4bcc342c8ee ("app/testpmd: refactor ieee1588 forwarding")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>

This patch looks independent from rest the patchset, and simple enough, so
merging it individually.

Applied to dpdk-next-net/master, thanks.

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

* Re: [dpdk-dev] [dpdk-stable] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field
  2019-03-19 18:29     ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
@ 2019-03-19 18:29       ` Ferruh Yigit
  0 siblings, 0 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-19 18:29 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/11/2019 3:35 PM, David Marchand wrote:
> Remove some leftover from a previous rework.
> 
> Fixes: c4bcc342c8ee ("app/testpmd: refactor ieee1588 forwarding")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>

This patch looks independent from rest the patchset, and simple enough, so
merging it individually.

Applied to dpdk-next-net/master, thanks.

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

* [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly
  2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
                     ` (3 preceding siblings ...)
  2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-20 10:02   ` David Marchand
  2019-03-20 10:02     ` David Marchand
                       ` (5 more replies)
  4 siblings, 6 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 450 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 315 insertions(+), 236 deletions(-)

-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
@ 2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics David Marchand
                       ` (4 subsequent siblings)
  5 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 450 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 315 insertions(+), 236 deletions(-)

-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-20 10:02     ` David Marchand
@ 2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02       ` David Marchand
  2019-03-20 13:49       ` Andrew Rybchenko
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
                       ` (3 subsequent siblings)
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
---
Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d9d0c16..78206f6 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-20 10:02       ` David Marchand
  2019-03-20 13:49       ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
---
Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d9d0c16..78206f6 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02       ` David Marchand
  2019-03-20 13:55       ` Andrew Rybchenko
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics David Marchand
                       ` (2 subsequent siblings)
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 78206f6..af9a765 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,38 +1771,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-20 10:02       ` David Marchand
  2019-03-20 13:55       ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 78206f6..af9a765 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,38 +1771,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
                       ` (2 preceding siblings ...)
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02       ` David Marchand
  2019-03-20 13:58       ` Andrew Rybchenko
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index af9a765..103319f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-20 10:02       ` David Marchand
  2019-03-20 13:58       ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index af9a765..103319f 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
                       ` (3 preceding siblings ...)
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-20 10:02     ` David Marchand
  2019-03-20 10:02       ` David Marchand
                         ` (2 more replies)
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 3 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 305 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index db53cc0..58b11b7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7386,6 +7386,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_fwd_parsed(void *parsed_result,
+	       __rte_unused struct cmdline *cl,
+	       __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_fwdall = {
+	.f = cmd_fwd_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_fwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 103319f..b466217 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1766,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1816,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1845,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,87 +1866,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-20 10:02       ` David Marchand
  2019-03-20 12:25       ` Ferruh Yigit
  2019-03-21 18:50       ` Ferruh Yigit
  2 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 10:02 UTC (permalink / raw)
  To: dev; +Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  44 +++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 305 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index db53cc0..58b11b7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7386,6 +7386,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_fwd_parsed(void *parsed_result,
+	       __rte_unused struct cmdline *cl,
+	       __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_fwdall = {
+	.f = cmd_fwd_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_fwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 103319f..b466217 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1766,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1816,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1845,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,87 +1866,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1


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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-20 10:02       ` David Marchand
@ 2019-03-20 12:25       ` Ferruh Yigit
  2019-03-20 12:25         ` Ferruh Yigit
  2019-03-20 12:44         ` David Marchand
  2019-03-21 18:50       ` Ferruh Yigit
  2 siblings, 2 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-20 12:25 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

On 3/20/2019 10:02 AM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.

Won't this be duplicating existing commands:
"show port stats all|<port_id>"
"clear port stats all|<port_id>"

What benefit "show/clear fwd stats all" adds against existing ones?

testpmd> show port stats all

  ######################## NIC statistics for port 0  ########################
  RX-packets: 133257152  RX-missed: 0          RX-bytes:  0
  RX-errors: 0
  RX-nombuf:  0
  TX-packets: 131952064  TX-errors: 0          TX-bytes:  0

  Throughput (since last show)
  Rx-pps:            0
  Tx-pps:            0
  ############################################################################

  ######################## NIC statistics for port 1  ########################
  RX-packets: 133333440  RX-missed: 0          RX-bytes:  0
  RX-errors: 0
  RX-nombuf:  0
  TX-packets: 131952064  TX-errors: 0          TX-bytes:  0

  Throughput (since last show)
  Rx-pps:            0
  Tx-pps:            0
  ############################################################################


> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changelog since v1:
> - removed hunk from now deleted patch 3
> 

<...>

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 12:25       ` Ferruh Yigit
@ 2019-03-20 12:25         ` Ferruh Yigit
  2019-03-20 12:44         ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-20 12:25 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

On 3/20/2019 10:02 AM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.

Won't this be duplicating existing commands:
"show port stats all|<port_id>"
"clear port stats all|<port_id>"

What benefit "show/clear fwd stats all" adds against existing ones?

testpmd> show port stats all

  ######################## NIC statistics for port 0  ########################
  RX-packets: 133257152  RX-missed: 0          RX-bytes:  0
  RX-errors: 0
  RX-nombuf:  0
  TX-packets: 131952064  TX-errors: 0          TX-bytes:  0

  Throughput (since last show)
  Rx-pps:            0
  Tx-pps:            0
  ############################################################################

  ######################## NIC statistics for port 1  ########################
  RX-packets: 133333440  RX-missed: 0          RX-bytes:  0
  RX-errors: 0
  RX-nombuf:  0
  TX-packets: 131952064  TX-errors: 0          TX-bytes:  0

  Throughput (since last show)
  Rx-pps:            0
  Tx-pps:            0
  ############################################################################


> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changelog since v1:
> - removed hunk from now deleted patch 3
> 

<...>


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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 12:25       ` Ferruh Yigit
  2019-03-20 12:25         ` Ferruh Yigit
@ 2019-03-20 12:44         ` David Marchand
  2019-03-20 12:44           ` David Marchand
  2019-03-20 13:29           ` Ferruh Yigit
  1 sibling, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 12:44 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On Wed, Mar 20, 2019 at 1:25 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 3/20/2019 10:02 AM, David Marchand wrote:
> > Add a new "show/clear fwd stats all" command to display fwd and port
> > statistics on the fly.
>
> Won't this be duplicating existing commands:
> "show port stats all|<port_id>"
> "clear port stats all|<port_id>"
>
> What benefit "show/clear fwd stats all" adds against existing ones?
>

Forwarding engines like "iofwd" maintain software statistics like
"fwd_dropped" which gives you how much of the packets to be transmitted
could not make it to the "wire".
"show port stats" won't give you those stats.

You could stop/start the forwarding to get them, but when debugging you
most likely do not want to stop the forwarding.
I have been using this while tracking drops in a PVP setup.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 12:44         ` David Marchand
@ 2019-03-20 12:44           ` David Marchand
  2019-03-20 13:29           ` Ferruh Yigit
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-20 12:44 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On Wed, Mar 20, 2019 at 1:25 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 3/20/2019 10:02 AM, David Marchand wrote:
> > Add a new "show/clear fwd stats all" command to display fwd and port
> > statistics on the fly.
>
> Won't this be duplicating existing commands:
> "show port stats all|<port_id>"
> "clear port stats all|<port_id>"
>
> What benefit "show/clear fwd stats all" adds against existing ones?
>

Forwarding engines like "iofwd" maintain software statistics like
"fwd_dropped" which gives you how much of the packets to be transmitted
could not make it to the "wire".
"show port stats" won't give you those stats.

You could stop/start the forwarding to get them, but when debugging you
most likely do not want to stop the forwarding.
I have been using this while tracking drops in a PVP setup.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 12:44         ` David Marchand
  2019-03-20 12:44           ` David Marchand
@ 2019-03-20 13:29           ` Ferruh Yigit
  2019-03-20 13:29             ` Ferruh Yigit
  1 sibling, 1 reply; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-20 13:29 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On 3/20/2019 12:44 PM, David Marchand wrote:
> On Wed, Mar 20, 2019 at 1:25 PM Ferruh Yigit <ferruh.yigit@intel.com
> <mailto:ferruh.yigit@intel.com>> wrote:
> 
>     On 3/20/2019 10:02 AM, David Marchand wrote:
>     > Add a new "show/clear fwd stats all" command to display fwd and port
>     > statistics on the fly.
> 
>     Won't this be duplicating existing commands:
>     "show port stats all|<port_id>"
>     "clear port stats all|<port_id>"
> 
>     What benefit "show/clear fwd stats all" adds against existing ones?
> 
> 
> Forwarding engines like "iofwd" maintain software statistics like "fwd_dropped"
> which gives you how much of the packets to be transmitted could not make it to
> the "wire".
> "show port stats" won't give you those stats.
> 
> You could stop/start the forwarding to get them, but when debugging you most
> likely do not want to stop the forwarding.
> I have been using this while tracking drops in a PVP setup.

I see, they are slightly different, no objection from me.

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 13:29           ` Ferruh Yigit
@ 2019-03-20 13:29             ` Ferruh Yigit
  0 siblings, 0 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-20 13:29 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On 3/20/2019 12:44 PM, David Marchand wrote:
> On Wed, Mar 20, 2019 at 1:25 PM Ferruh Yigit <ferruh.yigit@intel.com
> <mailto:ferruh.yigit@intel.com>> wrote:
> 
>     On 3/20/2019 10:02 AM, David Marchand wrote:
>     > Add a new "show/clear fwd stats all" command to display fwd and port
>     > statistics on the fly.
> 
>     Won't this be duplicating existing commands:
>     "show port stats all|<port_id>"
>     "clear port stats all|<port_id>"
> 
>     What benefit "show/clear fwd stats all" adds against existing ones?
> 
> 
> Forwarding engines like "iofwd" maintain software statistics like "fwd_dropped"
> which gives you how much of the packets to be transmitted could not make it to
> the "wire".
> "show port stats" won't give you those stats.
> 
> You could stop/start the forwarding to get them, but when debugging you most
> likely do not want to stop the forwarding.
> I have been using this while tracking drops in a PVP setup.

I see, they are slightly different, no objection from me.


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

* Re: [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics David Marchand
  2019-03-20 10:02       ` David Marchand
@ 2019-03-20 13:49       ` Andrew Rybchenko
  2019-03-20 13:49         ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:49 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

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

* Re: [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-20 13:49       ` Andrew Rybchenko
@ 2019-03-20 13:49         ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:49 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>


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

* Re: [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
  2019-03-20 10:02       ` David Marchand
@ 2019-03-20 13:55       ` Andrew Rybchenko
  2019-03-20 13:55         ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:55 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> fwd engine statistics are stored as unsigned int (32bits) and can wrap
> quite quickly.
> Example: sending 7mpps for 614s gives us 4298000000 packets =>
> 0x1002e4680 larger than 32bits.
>
> testpmd reports forwarding stats as:
> RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371
>
> While the port and accumulated stats are reported as 64bits:
> RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
> TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

RX and Rx are used for error stats. Don't know why. But the patch simply 
preserves it,
so not a problem of the patch.

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

* Re: [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-20 13:55       ` Andrew Rybchenko
@ 2019-03-20 13:55         ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:55 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> fwd engine statistics are stored as unsigned int (32bits) and can wrap
> quite quickly.
> Example: sending 7mpps for 614s gives us 4298000000 packets =>
> 0x1002e4680 larger than 32bits.
>
> testpmd reports forwarding stats as:
> RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371
>
> While the port and accumulated stats are reported as 64bits:
> RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
> TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

RX and Rx are used for error stats. Don't know why. But the patch simply 
preserves it,
so not a problem of the patch.


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

* Re: [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics David Marchand
  2019-03-20 10:02       ` David Marchand
@ 2019-03-20 13:58       ` Andrew Rybchenko
  2019-03-20 13:58         ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:58 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> Caught by code review while investigating the fwd stats display code.
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

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

* Re: [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics
  2019-03-20 13:58       ` Andrew Rybchenko
@ 2019-03-20 13:58         ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-20 13:58 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, stable

On 3/20/19 1:02 PM, David Marchand wrote:
> Caught by code review while investigating the fwd stats display code.
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>


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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-20 10:02       ` David Marchand
  2019-03-20 12:25       ` Ferruh Yigit
@ 2019-03-21 18:50       ` Ferruh Yigit
  2019-03-21 18:50         ` Ferruh Yigit
  2019-03-21 20:34         ` David Marchand
  2 siblings, 2 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-21 18:50 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

On 3/20/2019 10:02 AM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.
> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

<...>

> +/* show/clear fwd engine statistics */
> +struct fwd_result {
> +	cmdline_fixed_string_t action;
> +	cmdline_fixed_string_t fwd;
> +	cmdline_fixed_string_t stats;
> +	cmdline_fixed_string_t all;
> +};
> +
> +cmdline_parse_token_string_t cmd_fwd_action =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
> +cmdline_parse_token_string_t cmd_fwd_fwd =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
> +cmdline_parse_token_string_t cmd_fwd_stats =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
> +cmdline_parse_token_string_t cmd_fwd_all =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");

Do we need "all"?
Normally we have it when there is selection between specific <port_id> or all,
here only option is all.

> +
> +static void
> +cmd_fwd_parsed(void *parsed_result,
> +	       __rte_unused struct cmdline *cl,
> +	       __rte_unused void *data)
> +{
> +	struct fwd_result *res = parsed_result;
> +
> +	if (!strcmp(res->action, "show"))
> +		fwd_stats_display();
> +	else
> +		fwd_stats_reset();
> +}
> +
> +static cmdline_parse_inst_t cmd_fwdall = {
> +	.f = cmd_fwd_parsed,
> +	.data = NULL,
> +	.help_str = "show|clear fwd stats all",
> +	.tokens = {
> +		(void *)&cmd_fwd_action,
> +		(void *)&cmd_fwd_fwd,
> +		(void *)&cmd_fwd_stats,
> +		(void *)&cmd_fwd_all,
> +		NULL,
> +	},
> +};

in 'app/test-pmd/cmdline.c', there is 'cmd_help_long_parsed()' function to
display the help output, can you please add new command information there too?

> +
>  /* *** READ PORT REGISTER *** */
>  struct cmd_read_reg_result {
>  	cmdline_fixed_string_t read;
> @@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
>  	(cmdline_parse_inst_t *)&cmd_showqueue,
>  	(cmdline_parse_inst_t *)&cmd_showportall,
>  	(cmdline_parse_inst_t *)&cmd_showcfg,
> +	(cmdline_parse_inst_t *)&cmd_fwdall,

command name looks misleading 'fwdall', it feels like it is something doing
forwarding more than display, what about following same syntax with above
'cmd_showportall', so 'cmd_showfwdall' or 'cmd_showfwd' based on your answer to
drop "all"?

<...>

> +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> +		fwd_cycles += fs->core_cycles;
> +#endif

Ahh, it seems I missed this config option, looks useful :)
I wonder if it is documented anywhere.

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-21 18:50       ` Ferruh Yigit
@ 2019-03-21 18:50         ` Ferruh Yigit
  2019-03-21 20:34         ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-21 18:50 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko

On 3/20/2019 10:02 AM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.
> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

<...>

> +/* show/clear fwd engine statistics */
> +struct fwd_result {
> +	cmdline_fixed_string_t action;
> +	cmdline_fixed_string_t fwd;
> +	cmdline_fixed_string_t stats;
> +	cmdline_fixed_string_t all;
> +};
> +
> +cmdline_parse_token_string_t cmd_fwd_action =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
> +cmdline_parse_token_string_t cmd_fwd_fwd =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
> +cmdline_parse_token_string_t cmd_fwd_stats =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
> +cmdline_parse_token_string_t cmd_fwd_all =
> +	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");

Do we need "all"?
Normally we have it when there is selection between specific <port_id> or all,
here only option is all.

> +
> +static void
> +cmd_fwd_parsed(void *parsed_result,
> +	       __rte_unused struct cmdline *cl,
> +	       __rte_unused void *data)
> +{
> +	struct fwd_result *res = parsed_result;
> +
> +	if (!strcmp(res->action, "show"))
> +		fwd_stats_display();
> +	else
> +		fwd_stats_reset();
> +}
> +
> +static cmdline_parse_inst_t cmd_fwdall = {
> +	.f = cmd_fwd_parsed,
> +	.data = NULL,
> +	.help_str = "show|clear fwd stats all",
> +	.tokens = {
> +		(void *)&cmd_fwd_action,
> +		(void *)&cmd_fwd_fwd,
> +		(void *)&cmd_fwd_stats,
> +		(void *)&cmd_fwd_all,
> +		NULL,
> +	},
> +};

in 'app/test-pmd/cmdline.c', there is 'cmd_help_long_parsed()' function to
display the help output, can you please add new command information there too?

> +
>  /* *** READ PORT REGISTER *** */
>  struct cmd_read_reg_result {
>  	cmdline_fixed_string_t read;
> @@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
>  	(cmdline_parse_inst_t *)&cmd_showqueue,
>  	(cmdline_parse_inst_t *)&cmd_showportall,
>  	(cmdline_parse_inst_t *)&cmd_showcfg,
> +	(cmdline_parse_inst_t *)&cmd_fwdall,

command name looks misleading 'fwdall', it feels like it is something doing
forwarding more than display, what about following same syntax with above
'cmd_showportall', so 'cmd_showfwdall' or 'cmd_showfwd' based on your answer to
drop "all"?

<...>

> +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> +		fwd_cycles += fs->core_cycles;
> +#endif

Ahh, it seems I missed this config option, looks useful :)
I wonder if it is documented anywhere.

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-21 18:50       ` Ferruh Yigit
  2019-03-21 18:50         ` Ferruh Yigit
@ 2019-03-21 20:34         ` David Marchand
  2019-03-21 20:34           ` David Marchand
  1 sibling, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-21 20:34 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On Thu, Mar 21, 2019 at 7:50 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 3/20/2019 10:02 AM, David Marchand wrote:
> > Add a new "show/clear fwd stats all" command to display fwd and port
> > statistics on the fly.
> >
> > To be able to do so, the (testpmd only) rte_port structure can't be used
> > to maintain any statistics.
> > Moved the stats dump parts from stop_packet_forwarding() and merge with
> > fwd_port_stats_display() into fwd_stats_display().
> > fwd engine statistics are then aggregated into a local per port array.
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
>
> <...>
>
> > +/* show/clear fwd engine statistics */
> > +struct fwd_result {
> > +     cmdline_fixed_string_t action;
> > +     cmdline_fixed_string_t fwd;
> > +     cmdline_fixed_string_t stats;
> > +     cmdline_fixed_string_t all;
> > +};
> > +
> > +cmdline_parse_token_string_t cmd_fwd_action =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
> > +cmdline_parse_token_string_t cmd_fwd_fwd =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
> > +cmdline_parse_token_string_t cmd_fwd_stats =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
> > +cmdline_parse_token_string_t cmd_fwd_all =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
>
> Do we need "all"?
> Normally we have it when there is selection between specific <port_id> or
> all,
> here only option is all.
>

Well, the thing is that if we add a specific <fwd_id> later, we would have
to introduce this "all".
And since a lot of people are going to use this command, this would break
their scripts ;-)

I find it consistent with "show port stats all" as well.


> > +
> > +static void
> > +cmd_fwd_parsed(void *parsed_result,
> > +            __rte_unused struct cmdline *cl,
> > +            __rte_unused void *data)
> > +{
> > +     struct fwd_result *res = parsed_result;
> > +
> > +     if (!strcmp(res->action, "show"))
> > +             fwd_stats_display();
> > +     else
> > +             fwd_stats_reset();
> > +}
> > +
> > +static cmdline_parse_inst_t cmd_fwdall = {
> > +     .f = cmd_fwd_parsed,
> > +     .data = NULL,
> > +     .help_str = "show|clear fwd stats all",
> > +     .tokens = {
> > +             (void *)&cmd_fwd_action,
> > +             (void *)&cmd_fwd_fwd,
> > +             (void *)&cmd_fwd_stats,
> > +             (void *)&cmd_fwd_all,
> > +             NULL,
> > +     },
> > +};
>
> in 'app/test-pmd/cmdline.c', there is 'cmd_help_long_parsed()' function to
> display the help output, can you please add new command information there
> too?
>

Indeed, will do.



> > +
> >  /* *** READ PORT REGISTER *** */
> >  struct cmd_read_reg_result {
> >       cmdline_fixed_string_t read;
> > @@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
> >       (cmdline_parse_inst_t *)&cmd_showqueue,
> >       (cmdline_parse_inst_t *)&cmd_showportall,
> >       (cmdline_parse_inst_t *)&cmd_showcfg,
> > +     (cmdline_parse_inst_t *)&cmd_fwdall,
>
> command name looks misleading 'fwdall', it feels like it is something doing
> forwarding more than display, what about following same syntax with above
> 'cmd_showportall', so 'cmd_showfwdall' or 'cmd_showfwd' based on your
> answer to
> drop "all"?
>

I would go with cmd_showfwdall.


> <...>
>
> > +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> > +             fwd_cycles += fs->core_cycles;
> > +#endif
>
> Ahh, it seems I missed this config option, looks useful :)
> I wonder if it is documented anywhere.
>

Well, it does seem quite unknown.
I am not sure of the accuracy, just tried it to check if it was really
broken or not, seems to work.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-21 20:34         ` David Marchand
@ 2019-03-21 20:34           ` David Marchand
  0 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-21 20:34 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko

On Thu, Mar 21, 2019 at 7:50 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 3/20/2019 10:02 AM, David Marchand wrote:
> > Add a new "show/clear fwd stats all" command to display fwd and port
> > statistics on the fly.
> >
> > To be able to do so, the (testpmd only) rte_port structure can't be used
> > to maintain any statistics.
> > Moved the stats dump parts from stop_packet_forwarding() and merge with
> > fwd_port_stats_display() into fwd_stats_display().
> > fwd engine statistics are then aggregated into a local per port array.
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
>
> <...>
>
> > +/* show/clear fwd engine statistics */
> > +struct fwd_result {
> > +     cmdline_fixed_string_t action;
> > +     cmdline_fixed_string_t fwd;
> > +     cmdline_fixed_string_t stats;
> > +     cmdline_fixed_string_t all;
> > +};
> > +
> > +cmdline_parse_token_string_t cmd_fwd_action =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
> > +cmdline_parse_token_string_t cmd_fwd_fwd =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
> > +cmdline_parse_token_string_t cmd_fwd_stats =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
> > +cmdline_parse_token_string_t cmd_fwd_all =
> > +     TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
>
> Do we need "all"?
> Normally we have it when there is selection between specific <port_id> or
> all,
> here only option is all.
>

Well, the thing is that if we add a specific <fwd_id> later, we would have
to introduce this "all".
And since a lot of people are going to use this command, this would break
their scripts ;-)

I find it consistent with "show port stats all" as well.


> > +
> > +static void
> > +cmd_fwd_parsed(void *parsed_result,
> > +            __rte_unused struct cmdline *cl,
> > +            __rte_unused void *data)
> > +{
> > +     struct fwd_result *res = parsed_result;
> > +
> > +     if (!strcmp(res->action, "show"))
> > +             fwd_stats_display();
> > +     else
> > +             fwd_stats_reset();
> > +}
> > +
> > +static cmdline_parse_inst_t cmd_fwdall = {
> > +     .f = cmd_fwd_parsed,
> > +     .data = NULL,
> > +     .help_str = "show|clear fwd stats all",
> > +     .tokens = {
> > +             (void *)&cmd_fwd_action,
> > +             (void *)&cmd_fwd_fwd,
> > +             (void *)&cmd_fwd_stats,
> > +             (void *)&cmd_fwd_all,
> > +             NULL,
> > +     },
> > +};
>
> in 'app/test-pmd/cmdline.c', there is 'cmd_help_long_parsed()' function to
> display the help output, can you please add new command information there
> too?
>

Indeed, will do.



> > +
> >  /* *** READ PORT REGISTER *** */
> >  struct cmd_read_reg_result {
> >       cmdline_fixed_string_t read;
> > @@ -18559,6 +18602,7 @@ struct cmd_show_tx_metadata_result {
> >       (cmdline_parse_inst_t *)&cmd_showqueue,
> >       (cmdline_parse_inst_t *)&cmd_showportall,
> >       (cmdline_parse_inst_t *)&cmd_showcfg,
> > +     (cmdline_parse_inst_t *)&cmd_fwdall,
>
> command name looks misleading 'fwdall', it feels like it is something doing
> forwarding more than display, what about following same syntax with above
> 'cmd_showportall', so 'cmd_showfwdall' or 'cmd_showfwd' based on your
> answer to
> drop "all"?
>

I would go with cmd_showfwdall.


> <...>
>
> > +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
> > +             fwd_cycles += fs->core_cycles;
> > +#endif
>
> Ahh, it seems I missed this config option, looks useful :)
> I wonder if it is documented anywhere.
>

Well, it does seem quite unknown.
I am not sure of the accuracy, just tried it to check if it was really
broken or not, seems to work.


-- 
David Marchand

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

* [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly
  2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
                       ` (4 preceding siblings ...)
  2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-22 13:37     ` David Marchand
  2019-03-22 13:37       ` David Marchand
                         ` (5 more replies)
  5 siblings, 6 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v3:
- updated patch 4 following Ferruh comments

Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  49 +++
 app/test-pmd/testpmd.c                      | 450 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 320 insertions(+), 236 deletions(-)

-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
@ 2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
                         ` (4 subsequent siblings)
  5 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v3:
- updated patch 4 following Ferruh comments

Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  49 +++
 app/test-pmd/testpmd.c                      | 450 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 320 insertions(+), 236 deletions(-)

-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-22 13:37       ` David Marchand
@ 2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37         ` David Marchand
                           ` (3 more replies)
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
                         ` (3 subsequent siblings)
  5 siblings, 4 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47..40199c1 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-22 13:37         ` David Marchand
  2019-03-22 17:03         ` Maxime Coquelin
                           ` (2 subsequent siblings)
  3 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
  RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
  TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]

After:
  RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
  RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
  TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Rami Rosen <ramirose@gmail.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47..40199c1 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,7 +1459,7 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37         ` David Marchand
  2019-03-22 17:06         ` Maxime Coquelin
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics David Marchand
                         ` (2 subsequent siblings)
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 40199c1..d2ba770 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,38 +1771,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-22 13:37         ` David Marchand
  2019-03-22 17:06         ` Maxime Coquelin
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 40199c1..d2ba770 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64"\n",
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	}
@@ -1743,9 +1745,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1772,38 +1771,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
                         ` (2 preceding siblings ...)
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37         ` David Marchand
  2019-03-22 17:11         ` Maxime Coquelin
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d2ba770..8c3be14 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-22 13:37         ` David Marchand
  2019-03-22 17:11         ` Maxime Coquelin
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index d2ba770..8c3be14 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
                         ` (3 preceding siblings ...)
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-22 13:37       ` David Marchand
  2019-03-22 13:37         ` David Marchand
  2019-03-22 17:22         ` Maxime Coquelin
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v3:
- added description in testpmd usage
- renamed cmd_fwdall as cmd_showfwdall

Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  49 ++++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 310 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 815e5e8..ee50e45 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -225,6 +225,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                         "show port tm node stats (port_id) (node_id) (clear)\n"
                         "       Display the port TM node stats.\n\n"
 
+			"show fwd stats all\n"
+			"    Display statistics for all fwd engines.\n\n"
+
+			"clear fwd stats all\n"
+			"    Clear statistics for all fwd engines.\n\n"
 		);
 	}
 
@@ -7386,6 +7391,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_showfwdall_parsed(void *parsed_result,
+		      __rte_unused struct cmdline *cl,
+		      __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_showfwdall = {
+	.f = cmd_showfwdall_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18607,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_showfwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 8c3be14..6cb7675 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1766,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1816,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1845,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,87 +1866,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-22 13:37         ` David Marchand
  2019-03-22 17:22         ` Maxime Coquelin
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 13:37 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v3:
- added description in testpmd usage
- renamed cmd_fwdall as cmd_showfwdall

Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  49 ++++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 310 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 815e5e8..ee50e45 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -225,6 +225,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                         "show port tm node stats (port_id) (node_id) (clear)\n"
                         "       Display the port TM node stats.\n\n"
 
+			"show fwd stats all\n"
+			"    Display statistics for all fwd engines.\n\n"
+
+			"clear fwd stats all\n"
+			"    Clear statistics for all fwd engines.\n\n"
 		);
 	}
 
@@ -7386,6 +7391,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_showfwdall_parsed(void *parsed_result,
+		      __rte_unused struct cmdline *cl,
+		      __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_showfwdall = {
+	.f = cmd_showfwdall_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18607,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_showfwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 8c3be14..6cb7675 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1478,6 +1393,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1633,7 +1766,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1684,32 +1816,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1733,23 +1845,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1767,87 +1866,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1


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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
  2019-03-22 13:37         ` David Marchand
@ 2019-03-22 17:03         ` Maxime Coquelin
  2019-03-22 17:03           ` Maxime Coquelin
  2019-03-22 17:17         ` Maxime Coquelin
  2019-03-22 17:35         ` Andrew Rybchenko
  3 siblings, 1 reply; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:03 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
> 
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> 
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47..40199c1 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>   	       "TX Port=%2d/Queue=%2d %s\n",
>   	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>   	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>   	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>   
>   	/* if checksum mode */
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:03         ` Maxime Coquelin
@ 2019-03-22 17:03           ` Maxime Coquelin
  0 siblings, 0 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:03 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
> 
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> 
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47..40199c1 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>   	       "TX Port=%2d/Queue=%2d %s\n",
>   	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>   	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>   	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>   
>   	/* if checksum mode */
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
  2019-03-22 13:37         ` David Marchand
@ 2019-03-22 17:06         ` Maxime Coquelin
  2019-03-22 17:06           ` Maxime Coquelin
  1 sibling, 1 reply; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:06 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> fwd engine statistics are stored as unsigned int (32bits) and can wrap
> quite quickly.
> Example: sending 7mpps for 614s gives us 4298000000 packets =>
> 0x1002e4680 larger than 32bits.
> 
> testpmd reports forwarding stats as:
> RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371
> 
> While the port and accumulated stats are reported as 64bits:
> RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
> TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - split out of the previous patch with a dedicated commitlog
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
>   app/test-pmd/testpmd.h | 12 ++++++------
>   2 files changed, 23 insertions(+), 40 deletions(-)
> 


Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-22 17:06         ` Maxime Coquelin
@ 2019-03-22 17:06           ` Maxime Coquelin
  0 siblings, 0 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:06 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> fwd engine statistics are stored as unsigned int (32bits) and can wrap
> quite quickly.
> Example: sending 7mpps for 614s gives us 4298000000 packets =>
> 0x1002e4680 larger than 32bits.
> 
> testpmd reports forwarding stats as:
> RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371
> 
> While the port and accumulated stats are reported as 64bits:
> RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
> TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - split out of the previous patch with a dedicated commitlog
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
>   app/test-pmd/testpmd.h | 12 ++++++------
>   2 files changed, 23 insertions(+), 40 deletions(-)
> 


Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics David Marchand
  2019-03-22 13:37         ` David Marchand
@ 2019-03-22 17:11         ` Maxime Coquelin
  2019-03-22 17:11           ` Maxime Coquelin
  1 sibling, 1 reply; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:11 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Caught by code review while investigating the fwd stats display code.
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - focused on useless casts only
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics
  2019-03-22 17:11         ` Maxime Coquelin
@ 2019-03-22 17:11           ` Maxime Coquelin
  0 siblings, 0 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:11 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Caught by code review while investigating the fwd stats display code.
> 
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - focused on useless casts only
> - Cc'd stable
> 
> ---
>   app/test-pmd/testpmd.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
  2019-03-22 13:37         ` David Marchand
  2019-03-22 17:03         ` Maxime Coquelin
@ 2019-03-22 17:17         ` Maxime Coquelin
  2019-03-22 17:17           ` Maxime Coquelin
  2019-03-22 17:23           ` David Marchand
  2019-03-22 17:35         ` Andrew Rybchenko
  3 siblings, 2 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:17 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
> 
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> 
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> 
> Fixes: af75078fece3 ("first public release")
> Cc:stable@dpdk.org

While the patch is good, I wonder whether we should backport it.
Indeed, it might break some scripts parsing testpmd output.

Any thoughts?

> Signed-off-by: David Marchand<david.marchand@redhat.com>
> Reviewed-by: Rami Rosen<ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko<arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
> 
> ---

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:17         ` Maxime Coquelin
@ 2019-03-22 17:17           ` Maxime Coquelin
  2019-03-22 17:23           ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:17 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit, stable



On 3/22/19 2:37 PM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
> 
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> 
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> 
> Fixes: af75078fece3 ("first public release")
> Cc:stable@dpdk.org

While the patch is good, I wonder whether we should backport it.
Indeed, it might break some scripts parsing testpmd output.

Any thoughts?

> Signed-off-by: David Marchand<david.marchand@redhat.com>
> Reviewed-by: Rami Rosen<ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko<arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
> 
> ---

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

* Re: [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-22 13:37         ` David Marchand
@ 2019-03-22 17:22         ` Maxime Coquelin
  2019-03-22 17:22           ` Maxime Coquelin
  1 sibling, 1 reply; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:22 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit



On 3/22/19 2:37 PM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.
> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changelog since v3:
> - added description in testpmd usage
> - renamed cmd_fwdall as cmd_showfwdall
> 
> Changelog since v1:
> - removed hunk from now deleted patch 3
> 
> ---
>   app/test-pmd/cmdline.c                      |  49 ++++
>   app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
>   app/test-pmd/testpmd.h                      |   9 +-
>   doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
>   4 files changed, 310 insertions(+), 209 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-22 17:22         ` Maxime Coquelin
@ 2019-03-22 17:22           ` Maxime Coquelin
  0 siblings, 0 replies; 109+ messages in thread
From: Maxime Coquelin @ 2019-03-22 17:22 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	ferruh.yigit



On 3/22/19 2:37 PM, David Marchand wrote:
> Add a new "show/clear fwd stats all" command to display fwd and port
> statistics on the fly.
> 
> To be able to do so, the (testpmd only) rte_port structure can't be used
> to maintain any statistics.
> Moved the stats dump parts from stop_packet_forwarding() and merge with
> fwd_port_stats_display() into fwd_stats_display().
> fwd engine statistics are then aggregated into a local per port array.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changelog since v3:
> - added description in testpmd usage
> - renamed cmd_fwdall as cmd_showfwdall
> 
> Changelog since v1:
> - removed hunk from now deleted patch 3
> 
> ---
>   app/test-pmd/cmdline.c                      |  49 ++++
>   app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
>   app/test-pmd/testpmd.h                      |   9 +-
>   doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
>   4 files changed, 310 insertions(+), 209 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:17         ` Maxime Coquelin
  2019-03-22 17:17           ` Maxime Coquelin
@ 2019-03-22 17:23           ` David Marchand
  2019-03-22 17:23             ` David Marchand
  2019-03-22 17:31             ` Andrew Rybchenko
  1 sibling, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 17:23 UTC (permalink / raw)
  To: Maxime Coquelin
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko, Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:17 PM Maxime Coquelin <maxime.coquelin@redhat.com>
wrote:

>
>
> On 3/22/19 2:37 PM, David Marchand wrote:
> > Having the standard stats and the rx burst stats on the same line gives a
> > really long line and is not consistent with the rest.
> >
> > Before:
> >    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6
>              RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
> others]
> >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> >
> > After:
> >    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
> >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >
> > Fixes: af75078fece3 ("first public release")
> > Cc:stable@dpdk.org
>
> While the patch is good, I wonder whether we should backport it.
> Indeed, it might break some scripts parsing testpmd output.
>
> Any thoughts?
>

It seems unlikely, this feature is disabled by default.
But yes, I would avoid backporting it.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:23           ` David Marchand
@ 2019-03-22 17:23             ` David Marchand
  2019-03-22 17:31             ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 17:23 UTC (permalink / raw)
  To: Maxime Coquelin
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Andrew Rybchenko, Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:17 PM Maxime Coquelin <maxime.coquelin@redhat.com>
wrote:

>
>
> On 3/22/19 2:37 PM, David Marchand wrote:
> > Having the standard stats and the rx burst stats on the same line gives a
> > really long line and is not consistent with the rest.
> >
> > Before:
> >    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6
>              RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
> others]
> >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> >
> > After:
> >    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
> >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >
> > Fixes: af75078fece3 ("first public release")
> > Cc:stable@dpdk.org
>
> While the patch is good, I wonder whether we should backport it.
> Indeed, it might break some scripts parsing testpmd output.
>
> Any thoughts?
>

It seems unlikely, this feature is disabled by default.
But yes, I would avoid backporting it.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:23           ` David Marchand
  2019-03-22 17:23             ` David Marchand
@ 2019-03-22 17:31             ` Andrew Rybchenko
  2019-03-22 17:31               ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-22 17:31 UTC (permalink / raw)
  To: David Marchand, Maxime Coquelin
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On 22.03.2019 20:23, David Marchand wrote:
>
>
> On Fri, Mar 22, 2019 at 6:17 PM Maxime Coquelin 
> <maxime.coquelin@redhat.com <mailto:maxime.coquelin@redhat.com>> wrote:
>
>
>
>     On 3/22/19 2:37 PM, David Marchand wrote:
>     > Having the standard stats and the rx burst stats on the same
>     line gives a
>     > really long line and is not consistent with the rest.
>     >
>     > Before:
>     >    RX-packets: 3542977        TX-packets: 3542971   TX-dropped:
>     6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts
>     + 61% of others]
>     >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
>     others]
>     >
>     > After:
>     >    RX-packets: 4629969        TX-packets: 4629969   TX-dropped: 0
>     >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of
>     others]
>     >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of
>     others]
>     >
>     > Fixes: af75078fece3 ("first public release")
>     > Cc:stable@dpdk.org <mailto:Cc%3Astable@dpdk.org>
>
>     While the patch is good, I wonder whether we should backport it.
>     Indeed, it might break some scripts parsing testpmd output.
>
>     Any thoughts?
>
>
> It seems unlikely, this feature is disabled by default.
> But yes, I would avoid backporting it.


For me it looks like a bug. That's why I think it should be backported, 
but the fix is not 100% correct in fact. I'll reply directly to the patch.

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:31             ` Andrew Rybchenko
@ 2019-03-22 17:31               ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-22 17:31 UTC (permalink / raw)
  To: David Marchand, Maxime Coquelin
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On 22.03.2019 20:23, David Marchand wrote:
>
>
> On Fri, Mar 22, 2019 at 6:17 PM Maxime Coquelin 
> <maxime.coquelin@redhat.com <mailto:maxime.coquelin@redhat.com>> wrote:
>
>
>
>     On 3/22/19 2:37 PM, David Marchand wrote:
>     > Having the standard stats and the rx burst stats on the same
>     line gives a
>     > really long line and is not consistent with the rest.
>     >
>     > Before:
>     >    RX-packets: 3542977        TX-packets: 3542971   TX-dropped:
>     6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts
>     + 61% of others]
>     >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
>     others]
>     >
>     > After:
>     >    RX-packets: 4629969        TX-packets: 4629969   TX-dropped: 0
>     >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of
>     others]
>     >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of
>     others]
>     >
>     > Fixes: af75078fece3 ("first public release")
>     > Cc:stable@dpdk.org <mailto:Cc%3Astable@dpdk.org>
>
>     While the patch is good, I wonder whether we should backport it.
>     Indeed, it might break some scripts parsing testpmd output.
>
>     Any thoughts?
>
>
> It seems unlikely, this feature is disabled by default.
> But yes, I would avoid backporting it.


For me it looks like a bug. That's why I think it should be backported, 
but the fix is not 100% correct in fact. I'll reply directly to the patch.



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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
                           ` (2 preceding siblings ...)
  2019-03-22 17:17         ` Maxime Coquelin
@ 2019-03-22 17:35         ` Andrew Rybchenko
  2019-03-22 17:35           ` Andrew Rybchenko
  2019-03-22 17:43           ` David Marchand
  3 siblings, 2 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-22 17:35 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose,
	ferruh.yigit, stable

On 22.03.2019 16:37, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
>
> ---
>   app/test-pmd/testpmd.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47..40199c1 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>   	       "TX Port=%2d/Queue=%2d %s\n",
>   	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>   	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>   	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>   
>   	/* if checksum mode */


In fact bad Rx checksum counters follow and I think they should be in 
this line.

That's why there is no \n here from the very beginning.

My fix for the bug (local) just add \n in else branch below.


Andrew.

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:35         ` Andrew Rybchenko
@ 2019-03-22 17:35           ` Andrew Rybchenko
  2019-03-22 17:43           ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-22 17:35 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose,
	ferruh.yigit, stable

On 22.03.2019 16:37, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
>    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6               RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
>
> After:
>    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
>    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Reviewed-by: Rami Rosen <ramirose@gmail.com>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
> Changelog since v2:
> - Cc'd stable
>
> ---
>   app/test-pmd/testpmd.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 216be47..40199c1 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1459,7 +1459,7 @@ struct extmem_param {
>   	       "TX Port=%2d/Queue=%2d %s\n",
>   	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
>   	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> -	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> +	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
>   	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
>   
>   	/* if checksum mode */


In fact bad Rx checksum counters follow and I think they should be in 
this line.

That's why there is no \n here from the very beginning.

My fix for the bug (local) just add \n in else branch below.


Andrew.


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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:35         ` Andrew Rybchenko
  2019-03-22 17:35           ` Andrew Rybchenko
@ 2019-03-22 17:43           ` David Marchand
  2019-03-22 17:43             ` David Marchand
  2019-03-23 19:12             ` David Marchand
  1 sibling, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 17:43 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <arybchenko@solarflare.com>
wrote:

> On 22.03.2019 16:37, David Marchand wrote:
> > Having the standard stats and the rx burst stats on the same line gives a
> > really long line and is not consistent with the rest.
> >
> > Before:
> >    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6
>              RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
> others]
> >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> >
> > After:
> >    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
> >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >
> > Fixes: af75078fece3 ("first public release")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > Reviewed-by: Rami Rosen <ramirose@gmail.com>
> > Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > ---
> > Changelog since v2:
> > - Cc'd stable
> >
> > ---
> >   app/test-pmd/testpmd.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> > index 216be47..40199c1 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1459,7 +1459,7 @@ struct extmem_param {
> >              "TX Port=%2d/Queue=%2d %s\n",
> >              fwd_top_stats_border, fs->rx_port, fs->rx_queue,
> >              fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> > -     printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> > +     printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
> >              fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
> >
> >       /* if checksum mode */
>
>
> In fact bad Rx checksum counters follow and I think they should be in
> this line.
>
> That's why there is no \n here from the very beginning.
>
> My fix for the bug (local) just add \n in else branch below.
>


Mm, ok, I will look at this monday.
I might add the \n in pkt_burst_stats_display() and update other callers.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:43           ` David Marchand
@ 2019-03-22 17:43             ` David Marchand
  2019-03-23 19:12             ` David Marchand
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-22 17:43 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <arybchenko@solarflare.com>
wrote:

> On 22.03.2019 16:37, David Marchand wrote:
> > Having the standard stats and the rx burst stats on the same line gives a
> > really long line and is not consistent with the rest.
> >
> > Before:
> >    RX-packets: 3542977        TX-packets: 3542971        TX-dropped: 6
>              RX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of
> others]
> >    TX-bursts : 499440 [24% of 2 pkts + 15% of 1 pkts + 61% of others]
> >
> > After:
> >    RX-packets: 4629969        TX-packets: 4629969        TX-dropped: 0
> >    RX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >    TX-bursts : 663328 [19% of 2 pkts + 17% of 3 pkts + 64% of others]
> >
> > Fixes: af75078fece3 ("first public release")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > Reviewed-by: Rami Rosen <ramirose@gmail.com>
> > Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > ---
> > Changelog since v2:
> > - Cc'd stable
> >
> > ---
> >   app/test-pmd/testpmd.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> > index 216be47..40199c1 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1459,7 +1459,7 @@ struct extmem_param {
> >              "TX Port=%2d/Queue=%2d %s\n",
> >              fwd_top_stats_border, fs->rx_port, fs->rx_queue,
> >              fs->tx_port, fs->tx_queue, fwd_top_stats_border);
> > -     printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
> > +     printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u\n",
> >              fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
> >
> >       /* if checksum mode */
>
>
> In fact bad Rx checksum counters follow and I think they should be in
> this line.
>
> That's why there is no \n here from the very beginning.
>
> My fix for the bug (local) just add \n in else branch below.
>


Mm, ok, I will look at this monday.
I might add the \n in pkt_burst_stats_display() and update other callers.


-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-22 17:43           ` David Marchand
  2019-03-22 17:43             ` David Marchand
@ 2019-03-23 19:12             ` David Marchand
  2019-03-23 19:12               ` David Marchand
  2019-03-25  6:34               ` Andrew Rybchenko
  1 sibling, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-23 19:12 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:43 PM David Marchand <david.marchand@redhat.com>
wrote:

> On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <
> arybchenko@solarflare.com> wrote:
>
>>
>> In fact bad Rx checksum counters follow and I think they should be in
>> this line.
>>
>> That's why there is no \n here from the very beginning.
>>
>> My fix for the bug (local) just add \n in else branch below.
>>
>
Just to be clear.

origin/master:
- iofwd engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 121811360      TX-packets: 121811392      TX-dropped:
0               RX-bursts : 3806605 [100% of 32 pkts]
  TX-bursts : 3806606 [100% of 32 pkts]

- csum engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 5467488        TX-packets: 5467520        TX-dropped:
0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
0              Rx- bad outer L4 checksum: 0
  RX-bursts : 170859 [100% of 32 pkts]
  TX-bursts : 170860 [100% of 32 pkts]


So, as suggested, I added a printf("\n") in the else for the csum engine
block:

- iofwd engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 259770560      TX-packets: 259770592      TX-dropped:
0
  RX-bursts : 8117830 [100% of 32 pkts]
  TX-bursts : 8117831 [100% of 32 pkts]

- csum engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 7834016        TX-packets: 7834048        TX-dropped:
0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
0              Rx- bad outer L4 checksum: 0
  RX-bursts : 244813 [100% of 32 pkts]
  TX-bursts : 244814 [100% of 32 pkts]


deal ?

-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-23 19:12             ` David Marchand
@ 2019-03-23 19:12               ` David Marchand
  2019-03-25  6:34               ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-23 19:12 UTC (permalink / raw)
  To: Andrew Rybchenko
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On Fri, Mar 22, 2019 at 6:43 PM David Marchand <david.marchand@redhat.com>
wrote:

> On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <
> arybchenko@solarflare.com> wrote:
>
>>
>> In fact bad Rx checksum counters follow and I think they should be in
>> this line.
>>
>> That's why there is no \n here from the very beginning.
>>
>> My fix for the bug (local) just add \n in else branch below.
>>
>
Just to be clear.

origin/master:
- iofwd engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 121811360      TX-packets: 121811392      TX-dropped:
0               RX-bursts : 3806605 [100% of 32 pkts]
  TX-bursts : 3806606 [100% of 32 pkts]

- csum engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 5467488        TX-packets: 5467520        TX-dropped:
0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
0              Rx- bad outer L4 checksum: 0
  RX-bursts : 170859 [100% of 32 pkts]
  TX-bursts : 170860 [100% of 32 pkts]


So, as suggested, I added a printf("\n") in the else for the csum engine
block:

- iofwd engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 259770560      TX-packets: 259770592      TX-dropped:
0
  RX-bursts : 8117830 [100% of 32 pkts]
  TX-bursts : 8117831 [100% of 32 pkts]

- csum engine:
  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
-------
  RX-packets: 7834016        TX-packets: 7834048        TX-dropped:
0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
0              Rx- bad outer L4 checksum: 0
  RX-bursts : 244813 [100% of 32 pkts]
  TX-bursts : 244814 [100% of 32 pkts]


deal ?

-- 
David Marchand

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-23 19:12             ` David Marchand
  2019-03-23 19:12               ` David Marchand
@ 2019-03-25  6:34               ` Andrew Rybchenko
  2019-03-25  6:34                 ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-25  6:34 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On 3/23/19 10:12 PM, David Marchand wrote:
> On Fri, Mar 22, 2019 at 6:43 PM David Marchand <david.marchand@redhat.com>
> wrote:
>
>> On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <
>> arybchenko@solarflare.com> wrote:
>>
>>> In fact bad Rx checksum counters follow and I think they should be in
>>> this line.
>>>
>>> That's why there is no \n here from the very beginning.
>>>
>>> My fix for the bug (local) just add \n in else branch below.
>>>
> Just to be clear.
>
> origin/master:
> - iofwd engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 121811360      TX-packets: 121811392      TX-dropped:
> 0               RX-bursts : 3806605 [100% of 32 pkts]
>    TX-bursts : 3806606 [100% of 32 pkts]
>
> - csum engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 5467488        TX-packets: 5467520        TX-dropped:
> 0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
> 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 170859 [100% of 32 pkts]
>    TX-bursts : 170860 [100% of 32 pkts]
>
>
> So, as suggested, I added a printf("\n") in the else for the csum engine
> block:
>
> - iofwd engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 259770560      TX-packets: 259770592      TX-dropped:
> 0
>    RX-bursts : 8117830 [100% of 32 pkts]
>    TX-bursts : 8117831 [100% of 32 pkts]
>
> - csum engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 7834016        TX-packets: 7834048        TX-dropped:
> 0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
> 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 244813 [100% of 32 pkts]
>    TX-bursts : 244814 [100% of 32 pkts]
>
>
> deal ?

Yes, thanks a lot.

Andrew.

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

* Re: [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-25  6:34               ` Andrew Rybchenko
@ 2019-03-25  6:34                 ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-25  6:34 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Wenzhuo Lu, Jingjing Wu, Iremonger, Bernard, Rami Rosen,
	Yigit, Ferruh, dpdk stable

On 3/23/19 10:12 PM, David Marchand wrote:
> On Fri, Mar 22, 2019 at 6:43 PM David Marchand <david.marchand@redhat.com>
> wrote:
>
>> On Fri, Mar 22, 2019 at 6:35 PM Andrew Rybchenko <
>> arybchenko@solarflare.com> wrote:
>>
>>> In fact bad Rx checksum counters follow and I think they should be in
>>> this line.
>>>
>>> That's why there is no \n here from the very beginning.
>>>
>>> My fix for the bug (local) just add \n in else branch below.
>>>
> Just to be clear.
>
> origin/master:
> - iofwd engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 121811360      TX-packets: 121811392      TX-dropped:
> 0               RX-bursts : 3806605 [100% of 32 pkts]
>    TX-bursts : 3806606 [100% of 32 pkts]
>
> - csum engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 5467488        TX-packets: 5467520        TX-dropped:
> 0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
> 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 170859 [100% of 32 pkts]
>    TX-bursts : 170860 [100% of 32 pkts]
>
>
> So, as suggested, I added a printf("\n") in the else for the csum engine
> block:
>
> - iofwd engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 259770560      TX-packets: 259770592      TX-dropped:
> 0
>    RX-bursts : 8117830 [100% of 32 pkts]
>    TX-bursts : 8117831 [100% of 32 pkts]
>
> - csum engine:
>    ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0
> -------
>    RX-packets: 7834016        TX-packets: 7834048        TX-dropped:
> 0               RX- bad IP checksum: 0               Rx- bad L4 checksum:
> 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 244813 [100% of 32 pkts]
>    TX-bursts : 244814 [100% of 32 pkts]
>
>
> deal ?

Yes, thanks a lot.

Andrew.


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

* [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly
  2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
                         ` (4 preceding siblings ...)
  2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-25  8:51       ` David Marchand
  2019-03-25  8:51         ` David Marchand
                           ` (5 more replies)
  5 siblings, 6 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v4:
- take csum engine output into account in patch 1 (Andrew comment)

Changelog since v3:
- updated patch 4 following Ferruh comments

Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  49 +++
 app/test-pmd/testpmd.c                      | 452 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 322 insertions(+), 236 deletions(-)

-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
@ 2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics David Marchand
                           ` (4 subsequent siblings)
  5 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit

Here is a little series that makes it possible to display and clear
testpmd fwd engines while they run without having to stop them.
This is mostly handy when running stress tests and you look for packets
drops without having to stop/start testpmd forwarding.

Example:

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
  TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
  TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
  TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

testpmd> show fwd stats all 

  ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
  RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           

  ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
  RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
  TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
  TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
  TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- 
David Marchand

---
Changelog since v4:
- take csum engine output into account in patch 1 (Andrew comment)

Changelog since v3:
- updated patch 4 following Ferruh comments

Changelog since v2:
- first patch has been merged in net-next, removed from the series
- split patch (numbered 3 in v2) in two following Andrew comment

Changelog since v1:
- Cc: stable for patch 1
- removed buggy patch 3

---

David Marchand (4):
  app/testpmd: add missing newline when showing statistics
  app/testpmd: extend fwd statistics to 64bits
  app/testpmd: remove useless casts on statistics
  app/testpmd: display/clear forwarding stats on demand

 app/test-pmd/cmdline.c                      |  49 +++
 app/test-pmd/testpmd.c                      | 452 ++++++++++++++--------------
 app/test-pmd/testpmd.h                      |  21 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 322 insertions(+), 236 deletions(-)

-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-25  8:51         ` David Marchand
@ 2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51           ` David Marchand
  2019-03-25  8:55           ` Andrew Rybchenko
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
                           ` (3 subsequent siblings)
  5 siblings, 2 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
iofwd engine
  RX-packets: 121811360      TX-packets: 121811392      TX-dropped: 0               RX-bursts : 3806605 [100% of 32 pkts]
  TX-bursts : 3806606 [100% of 32 pkts]

csum engine
  RX-packets: 5467488        TX-packets: 5467520        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
  RX-bursts : 170859 [100% of 32 pkts]
  TX-bursts : 170860 [100% of 32 pkts]

After:
iofwd engine
  RX-packets: 259770560      TX-packets: 259770592      TX-dropped: 0
  RX-bursts : 8117830 [100% of 32 pkts]
  TX-bursts : 8117831 [100% of 32 pkts]

csum engine
  RX-packets: 7834016        TX-packets: 7834048        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
  RX-bursts : 244813 [100% of 32 pkts]
  TX-bursts : 244814 [100% of 32 pkts]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v4:
- let the csum stats at the same place than before, updated commitlog

Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47..7715844 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1468,6 +1468,8 @@ struct extmem_param {
 			"%-14u Rx- bad outer L4 checksum: %-14u\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
+	} else {
+		printf("\n");
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-25  8:51           ` David Marchand
  2019-03-25  8:55           ` Andrew Rybchenko
  1 sibling, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

Having the standard stats and the rx burst stats on the same line gives a
really long line and is not consistent with the rest.

Before:
iofwd engine
  RX-packets: 121811360      TX-packets: 121811392      TX-dropped: 0               RX-bursts : 3806605 [100% of 32 pkts]
  TX-bursts : 3806606 [100% of 32 pkts]

csum engine
  RX-packets: 5467488        TX-packets: 5467520        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
  RX-bursts : 170859 [100% of 32 pkts]
  TX-bursts : 170860 [100% of 32 pkts]

After:
iofwd engine
  RX-packets: 259770560      TX-packets: 259770592      TX-dropped: 0
  RX-bursts : 8117830 [100% of 32 pkts]
  TX-bursts : 8117831 [100% of 32 pkts]

csum engine
  RX-packets: 7834016        TX-packets: 7834048        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
  RX-bursts : 244813 [100% of 32 pkts]
  TX-bursts : 244814 [100% of 32 pkts]

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changelog since v4:
- let the csum stats at the same place than before, updated commitlog

Changelog since v2:
- Cc'd stable

---
 app/test-pmd/testpmd.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 216be47..7715844 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1468,6 +1468,8 @@ struct extmem_param {
 			"%-14u Rx- bad outer L4 checksum: %-14u\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
+	} else {
+		printf("\n");
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
  2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics David Marchand
@ 2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51           ` David Marchand
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics David Marchand
                           ` (2 subsequent siblings)
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v4:
- rebased following patch 1 update

Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 7715844..05a3dce 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64,
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	} else {
@@ -1745,9 +1747,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1774,38 +1773,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-25  8:51           ` David Marchand
  0 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

fwd engine statistics are stored as unsigned int (32bits) and can wrap
quite quickly.
Example: sending 7mpps for 614s gives us 4298000000 packets =>
0x1002e4680 larger than 32bits.

testpmd reports forwarding stats as:
RX-packets: 3500381        TX-packets: 3500010        TX-dropped: 371

While the port and accumulated stats are reported as 64bits:
RX-packets: 4298467677     RX-dropped: 0             RX-total: 4298467677
TX-packets: 4298467306     TX-dropped: 371           TX-total: 4298467677

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v4:
- rebased following patch 1 update

Changelog since v2:
- split out of the previous patch with a dedicated commitlog
- Cc'd stable

---
 app/test-pmd/testpmd.c | 51 +++++++++++++++++---------------------------------
 app/test-pmd/testpmd.h | 12 ++++++------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 7715844..05a3dce 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1459,13 +1459,15 @@ struct extmem_param {
 	       "TX Port=%2d/Queue=%2d %s\n",
 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
-	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
+	printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
+	       " TX-dropped: %-14"PRIu64,
 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
 
 	/* if checksum mode */
 	if (cur_fwd_eng == &csum_fwd_engine) {
-	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-			"%-14u Rx- bad outer L4 checksum: %-14u\n",
+		printf("  RX- bad IP checksum: %-14"PRIu64
+		       "  Rx- bad L4 checksum: %-14"PRIu64
+		       " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
 			fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
 			fs->rx_bad_outer_l4_csum);
 	} else {
@@ -1745,9 +1747,6 @@ struct extmem_param {
 	uint64_t total_rx_dropped;
 	uint64_t total_tx_dropped;
 	uint64_t total_rx_nombuf;
-	uint64_t tx_dropped;
-	uint64_t rx_bad_ip_csum;
-	uint64_t rx_bad_l4_csum;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t fwd_cycles;
 #endif
@@ -1774,38 +1773,22 @@ struct extmem_param {
 	fwd_cycles = 0;
 #endif
 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
 		if (cur_fwd_config.nb_fwd_streams >
 		    cur_fwd_config.nb_fwd_ports) {
 			fwd_stream_stats_display(sm_id);
-			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
-			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
+			ports[fs->tx_port].tx_stream = NULL;
+			ports[fs->rx_port].rx_stream = NULL;
 		} else {
-			ports[fwd_streams[sm_id]->tx_port].tx_stream =
-				fwd_streams[sm_id];
-			ports[fwd_streams[sm_id]->rx_port].rx_stream =
-				fwd_streams[sm_id];
-		}
-		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
-		tx_dropped = (uint64_t) (tx_dropped +
-					 fwd_streams[sm_id]->fwd_dropped);
-		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
-
-		rx_bad_ip_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
-		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
-					 fwd_streams[sm_id]->rx_bad_ip_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
-							rx_bad_ip_csum;
-
-		rx_bad_l4_csum =
-			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
-		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
-					 fwd_streams[sm_id]->rx_bad_l4_csum);
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
-							rx_bad_l4_csum;
-
-		ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
-				fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+			ports[fs->tx_port].tx_stream = fs;
+			ports[fs->rx_port].rx_stream = fs;
+		}
+		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
+		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 		fwd_cycles = (uint64_t) (fwd_cycles +
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 85b791b..4f4a48f 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -119,12 +119,12 @@ struct fwd_stream {
 	unsigned int retry_enabled;
 
 	/* "read-write" results */
-	unsigned int rx_packets;  /**< received packets */
-	unsigned int tx_packets;  /**< received packets transmitted */
-	unsigned int fwd_dropped; /**< received packets not forwarded */
-	unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */
-	unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
-	unsigned int rx_bad_outer_l4_csum;
+	uint64_t rx_packets;  /**< received packets */
+	uint64_t tx_packets;  /**< received packets transmitted */
+	uint64_t fwd_dropped; /**< received packets not forwarded */
+	uint64_t rx_bad_ip_csum ; /**< received packets has bad ip checksum */
+	uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */
+	uint64_t rx_bad_outer_l4_csum;
 	/**< received packets has bad outer l4 checksum */
 	unsigned int gro_times;	/**< GRO operation times */
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
                           ` (2 preceding siblings ...)
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
@ 2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51           ` David Marchand
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
  2019-03-25 14:05         ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly Ferruh Yigit
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 05a3dce..c78d524 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-25  8:51           ` David Marchand
  0 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit, stable

Caught by code review while investigating the fwd stats display code.

Fixes: af75078fece3 ("first public release")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v2:
- focused on useless casts only
- Cc'd stable

---
 app/test-pmd/testpmd.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 05a3dce..c78d524 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1376,7 +1376,7 @@ struct extmem_param {
 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
 		       "%-"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1390,13 +1390,13 @@ struct extmem_param {
 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
 		       "%-"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 	else {
 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
 		       "%14"PRIu64"\n",
 		       stats->ipackets, stats->imissed,
-		       (uint64_t) (stats->ipackets + stats->imissed));
+		       stats->ipackets + stats->imissed);
 
 		if (cur_fwd_eng == &csum_fwd_engine)
 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
@@ -1411,7 +1411,7 @@ struct extmem_param {
 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
 		       "%14"PRIu64"\n",
 		       stats->opackets, port->tx_dropped,
-		       (uint64_t) (stats->opackets + port->tx_dropped));
+		       stats->opackets + port->tx_dropped);
 	}
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-- 
1.8.3.1


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

* [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
                           ` (3 preceding siblings ...)
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics David Marchand
@ 2019-03-25  8:51         ` David Marchand
  2019-03-25  8:51           ` David Marchand
  2019-03-25 14:05         ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly Ferruh Yigit
  5 siblings, 1 reply; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v3:
- added description in testpmd usage
- renamed cmd_fwdall as cmd_showfwdall

Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  49 ++++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 310 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 815e5e8..ee50e45 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -225,6 +225,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                         "show port tm node stats (port_id) (node_id) (clear)\n"
                         "       Display the port TM node stats.\n\n"
 
+			"show fwd stats all\n"
+			"    Display statistics for all fwd engines.\n\n"
+
+			"clear fwd stats all\n"
+			"    Clear statistics for all fwd engines.\n\n"
 		);
 	}
 
@@ -7386,6 +7391,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_showfwdall_parsed(void *parsed_result,
+		      __rte_unused struct cmdline *cl,
+		      __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_showfwdall = {
+	.f = cmd_showfwdall_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18607,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_showfwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c78d524..ee8aa23 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1480,6 +1395,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1635,7 +1768,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1686,32 +1818,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1735,23 +1847,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1769,87 +1868,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1

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

* [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-25  8:51           ` David Marchand
  0 siblings, 0 replies; 109+ messages in thread
From: David Marchand @ 2019-03-25  8:51 UTC (permalink / raw)
  To: dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin, ferruh.yigit

Add a new "show/clear fwd stats all" command to display fwd and port
statistics on the fly.

To be able to do so, the (testpmd only) rte_port structure can't be used
to maintain any statistics.
Moved the stats dump parts from stop_packet_forwarding() and merge with
fwd_port_stats_display() into fwd_stats_display().
fwd engine statistics are then aggregated into a local per port array.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
Changelog since v3:
- added description in testpmd usage
- renamed cmd_fwdall as cmd_showfwdall

Changelog since v1:
- removed hunk from now deleted patch 3

---
 app/test-pmd/cmdline.c                      |  49 ++++
 app/test-pmd/testpmd.c                      | 425 +++++++++++++++-------------
 app/test-pmd/testpmd.h                      |   9 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  36 +++
 4 files changed, 310 insertions(+), 209 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 815e5e8..ee50e45 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -225,6 +225,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                         "show port tm node stats (port_id) (node_id) (clear)\n"
                         "       Display the port TM node stats.\n\n"
 
+			"show fwd stats all\n"
+			"    Display statistics for all fwd engines.\n\n"
+
+			"clear fwd stats all\n"
+			"    Clear statistics for all fwd engines.\n\n"
 		);
 	}
 
@@ -7386,6 +7391,49 @@ struct cmd_showqueue_result {
 	},
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+	cmdline_fixed_string_t action;
+	cmdline_fixed_string_t fwd;
+	cmdline_fixed_string_t stats;
+	cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+	TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_showfwdall_parsed(void *parsed_result,
+		      __rte_unused struct cmdline *cl,
+		      __rte_unused void *data)
+{
+	struct fwd_result *res = parsed_result;
+
+	if (!strcmp(res->action, "show"))
+		fwd_stats_display();
+	else
+		fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_showfwdall = {
+	.f = cmd_showfwdall_parsed,
+	.data = NULL,
+	.help_str = "show|clear fwd stats all",
+	.tokens = {
+		(void *)&cmd_fwd_action,
+		(void *)&cmd_fwd_fwd,
+		(void *)&cmd_fwd_stats,
+		(void *)&cmd_fwd_all,
+		NULL,
+	},
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
 	cmdline_fixed_string_t read;
@@ -18559,6 +18607,7 @@ struct cmd_show_tx_metadata_result {
 	(cmdline_parse_inst_t *)&cmd_showqueue,
 	(cmdline_parse_inst_t *)&cmd_showportall,
 	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_showfwdall,
 	(cmdline_parse_inst_t *)&cmd_start,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first,
 	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index c78d524..ee8aa23 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1361,91 +1361,6 @@ struct extmem_param {
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
-fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
-{
-	struct rte_port *port;
-	uint8_t i;
-
-	static const char *fwd_stats_border = "----------------------";
-
-	port = &ports[port_id];
-	printf("\n  %s Forward statistics for port %-2d %s\n",
-	       fwd_stats_border, port_id, fwd_stats_border);
-
-	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-		       "%-"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
-			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-		}
-
-		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-		       "%-"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-	else {
-		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
-		       "%14"PRIu64"\n",
-		       stats->ipackets, stats->imissed,
-		       stats->ipackets + stats->imissed);
-
-		if (cur_fwd_eng == &csum_fwd_engine)
-			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
-			       port->rx_bad_ip_csum, port->rx_bad_l4_csum,
-			       port->rx_bad_outer_l4_csum);
-		if ((stats->ierrors + stats->rx_nombuf) > 0) {
-			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
-			printf("  RX-nombufs:             %14"PRIu64"\n",
-			       stats->rx_nombuf);
-		}
-
-		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
-		       "%14"PRIu64"\n",
-		       stats->opackets, port->tx_dropped,
-		       stats->opackets + port->tx_dropped);
-	}
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-	if (port->rx_stream)
-		pkt_burst_stats_display("RX",
-			&port->rx_stream->rx_burst_stats);
-	if (port->tx_stream)
-		pkt_burst_stats_display("TX",
-			&port->tx_stream->tx_burst_stats);
-#endif
-
-	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets:%14"PRIu64
-			       "     RX-errors:%14"PRIu64
-			       "    RX-bytes:%14"PRIu64"\n",
-			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
-		}
-		printf("\n");
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets:%14"PRIu64
-			       "                                 TX-bytes:%14"PRIu64"\n",
-			       i, stats->q_opackets[i], stats->q_obytes[i]);
-		}
-	}
-
-	printf("  %s--------------------------------%s\n",
-	       fwd_stats_border, fwd_stats_border);
-}
-
-static void
 fwd_stream_stats_display(streamid_t stream_id)
 {
 	struct fwd_stream *fs;
@@ -1480,6 +1395,224 @@ struct extmem_param {
 #endif
 }
 
+void
+fwd_stats_display(void)
+{
+	static const char *fwd_stats_border = "----------------------";
+	static const char *acc_stats_border = "+++++++++++++++";
+	struct {
+		struct fwd_stream *rx_stream;
+		struct fwd_stream *tx_stream;
+		uint64_t tx_dropped;
+		uint64_t rx_bad_ip_csum;
+		uint64_t rx_bad_l4_csum;
+		uint64_t rx_bad_outer_l4_csum;
+	} ports_stats[RTE_MAX_ETHPORTS];
+	uint64_t total_rx_dropped = 0;
+	uint64_t total_tx_dropped = 0;
+	uint64_t total_rx_nombuf = 0;
+	struct rte_eth_stats stats;
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	uint64_t fwd_cycles = 0;
+#endif
+	uint64_t total_recv = 0;
+	uint64_t total_xmit = 0;
+	struct rte_port *port;
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	memset(ports_stats, 0, sizeof(ports_stats));
+
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		if (cur_fwd_config.nb_fwd_streams >
+		    cur_fwd_config.nb_fwd_ports) {
+			fwd_stream_stats_display(sm_id);
+		} else {
+			ports_stats[fs->tx_port].tx_stream = fs;
+			ports_stats[fs->rx_port].rx_stream = fs;
+		}
+
+		ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
+
+		ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
+		ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
+		ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
+				fs->rx_bad_outer_l4_csum;
+
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fwd_cycles += fs->core_cycles;
+#endif
+	}
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		uint8_t j;
+
+		pt_id = fwd_ports_ids[i];
+		port = &ports[pt_id];
+
+		rte_eth_stats_get(pt_id, &stats);
+		stats.ipackets -= port->stats.ipackets;
+		stats.opackets -= port->stats.opackets;
+		stats.ibytes -= port->stats.ibytes;
+		stats.obytes -= port->stats.obytes;
+		stats.imissed -= port->stats.imissed;
+		stats.oerrors -= port->stats.oerrors;
+		stats.rx_nombuf -= port->stats.rx_nombuf;
+
+		total_recv += stats.ipackets;
+		total_xmit += stats.opackets;
+		total_rx_dropped += stats.imissed;
+		total_tx_dropped += ports_stats[pt_id].tx_dropped;
+		total_tx_dropped += stats.oerrors;
+		total_rx_nombuf  += stats.rx_nombuf;
+
+		printf("\n  %s Forward statistics for port %-2d %s\n",
+		       fwd_stats_border, pt_id, fwd_stats_border);
+
+		if (!port->rx_queue_stats_mapping_enabled &&
+		    !port->tx_queue_stats_mapping_enabled) {
+			printf("  RX-packets: %-14"PRIu64
+			       " RX-dropped: %-14"PRIu64
+			       "RX-total: %-"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum: %-14"PRIu64
+				       " Bad-l4csum: %-14"PRIu64
+				       "Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if (stats.ierrors + stats.rx_nombuf > 0) {
+				printf("  RX-error: %-"PRIu64"\n",
+				       stats.ierrors);
+				printf("  RX-nombufs: %-14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets: %-14"PRIu64
+			       " TX-dropped: %-14"PRIu64
+			       "TX-total: %-"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		} else {
+			printf("  RX-packets:             %14"PRIu64
+			       "    RX-dropped:%14"PRIu64
+			       "    RX-total:%14"PRIu64"\n",
+			       stats.ipackets, stats.imissed,
+			       stats.ipackets + stats.imissed);
+
+			if (cur_fwd_eng == &csum_fwd_engine)
+				printf("  Bad-ipcsum:%14"PRIu64
+				       "    Bad-l4csum:%14"PRIu64
+				       "    Bad-outer-l4csum: %-14"PRIu64"\n",
+				       ports_stats[pt_id].rx_bad_ip_csum,
+				       ports_stats[pt_id].rx_bad_l4_csum,
+				       ports_stats[pt_id].rx_bad_outer_l4_csum);
+			if ((stats.ierrors + stats.rx_nombuf) > 0) {
+				printf("  RX-error:%"PRIu64"\n", stats.ierrors);
+				printf("  RX-nombufs:             %14"PRIu64"\n",
+				       stats.rx_nombuf);
+			}
+
+			printf("  TX-packets:             %14"PRIu64
+			       "    TX-dropped:%14"PRIu64
+			       "    TX-total:%14"PRIu64"\n",
+			       stats.opackets, ports_stats[pt_id].tx_dropped,
+			       stats.opackets + ports_stats[pt_id].tx_dropped);
+		}
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		if (ports_stats[pt_id].rx_stream)
+			pkt_burst_stats_display("RX",
+				&ports_stats[pt_id].rx_stream->rx_burst_stats);
+		if (ports_stats[pt_id].tx_stream)
+			pkt_burst_stats_display("TX",
+				&ports_stats[pt_id].tx_stream->tx_burst_stats);
+#endif
+
+		if (port->rx_queue_stats_mapping_enabled) {
+			printf("\n");
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "     RX-errors:%14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats.q_ipackets[j],
+				       stats.q_errors[j], stats.q_ibytes[j]);
+			}
+			printf("\n");
+		}
+		if (port->tx_queue_stats_mapping_enabled) {
+			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "                                 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats.q_opackets[j],
+				       stats.q_obytes[j]);
+			}
+		}
+
+		printf("  %s--------------------------------%s\n",
+		       fwd_stats_border, fwd_stats_border);
+	}
+
+	printf("\n  %s Accumulated forward statistics for all ports"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
+	       "%-"PRIu64"\n"
+	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
+	       "%-"PRIu64"\n",
+	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
+	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
+	if (total_rx_nombuf > 0)
+		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
+	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
+	       "%s\n",
+	       acc_stats_border, acc_stats_border);
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+	if (total_recv > 0)
+		printf("\n  CPU cycles/packet=%u (total cycles="
+		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
+		       (unsigned int)(fwd_cycles / total_recv),
+		       fwd_cycles, total_recv);
+#endif
+}
+
+void
+fwd_stats_reset(void)
+{
+	streamid_t sm_id;
+	portid_t pt_id;
+	int i;
+
+	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+		pt_id = fwd_ports_ids[i];
+		rte_eth_stats_get(pt_id, &ports[pt_id].stats);
+	}
+	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
+		struct fwd_stream *fs = fwd_streams[sm_id];
+
+		fs->rx_packets = 0;
+		fs->tx_packets = 0;
+		fs->fwd_dropped = 0;
+		fs->rx_bad_ip_csum = 0;
+		fs->rx_bad_l4_csum = 0;
+		fs->rx_bad_outer_l4_csum = 0;
+
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+		memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
+		memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
+#endif
+#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
+		fs->core_cycles = 0;
+#endif
+	}
+}
+
 static void
 flush_fwd_rx_queues(void)
 {
@@ -1635,7 +1768,6 @@ struct extmem_param {
 	struct rte_port *port;
 	unsigned int i;
 	portid_t   pt_id;
-	streamid_t sm_id;
 
 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
@@ -1686,32 +1818,12 @@ struct extmem_param {
 	pkt_fwd_config_display(&cur_fwd_config);
 	rxtx_config_display();
 
+	fwd_stats_reset();
 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
 		pt_id = fwd_ports_ids[i];
 		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &port->stats);
-		port->tx_dropped = 0;
-
 		map_port_queue_stats_mapping_registers(pt_id, port);
 	}
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		fwd_streams[sm_id]->rx_packets = 0;
-		fwd_streams[sm_id]->tx_packets = 0;
-		fwd_streams[sm_id]->fwd_dropped = 0;
-		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
-		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
-		fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
-
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
-		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
-		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_streams[sm_id]->core_cycles = 0;
-#endif
-	}
 	if (with_tx_first) {
 		port_fwd_begin = tx_only_engine.port_fwd_begin;
 		if (port_fwd_begin != NULL) {
@@ -1735,23 +1847,10 @@ struct extmem_param {
 void
 stop_packet_forwarding(void)
 {
-	struct rte_eth_stats stats;
-	struct rte_port *port;
-	port_fwd_end_t  port_fwd_end;
+	port_fwd_end_t port_fwd_end;
+	lcoreid_t lc_id;
+	portid_t pt_id;
 	int i;
-	portid_t   pt_id;
-	streamid_t sm_id;
-	lcoreid_t  lc_id;
-	uint64_t total_recv;
-	uint64_t total_xmit;
-	uint64_t total_rx_dropped;
-	uint64_t total_tx_dropped;
-	uint64_t total_rx_nombuf;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	uint64_t fwd_cycles;
-#endif
-
-	static const char *acc_stats_border = "+++++++++++++++";
 
 	if (test_done) {
 		printf("Packet forwarding not started\n");
@@ -1769,87 +1868,9 @@ struct extmem_param {
 			(*port_fwd_end)(pt_id);
 		}
 	}
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	fwd_cycles = 0;
-#endif
-	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
-		struct fwd_stream *fs = fwd_streams[sm_id];
-
-		if (cur_fwd_config.nb_fwd_streams >
-		    cur_fwd_config.nb_fwd_ports) {
-			fwd_stream_stats_display(sm_id);
-			ports[fs->tx_port].tx_stream = NULL;
-			ports[fs->rx_port].rx_stream = NULL;
-		} else {
-			ports[fs->tx_port].tx_stream = fs;
-			ports[fs->rx_port].rx_stream = fs;
-		}
-		ports[fs->tx_port].tx_dropped += fs->fwd_dropped;
-		ports[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
-		ports[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
-		ports[fs->rx_port].rx_bad_outer_l4_csum +=
-				fs->rx_bad_outer_l4_csum;
-
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-		fwd_cycles = (uint64_t) (fwd_cycles +
-					 fwd_streams[sm_id]->core_cycles);
-#endif
-	}
-	total_recv = 0;
-	total_xmit = 0;
-	total_rx_dropped = 0;
-	total_tx_dropped = 0;
-	total_rx_nombuf  = 0;
-	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		pt_id = fwd_ports_ids[i];
-
-		port = &ports[pt_id];
-		rte_eth_stats_get(pt_id, &stats);
-		stats.ipackets -= port->stats.ipackets;
-		port->stats.ipackets = 0;
-		stats.opackets -= port->stats.opackets;
-		port->stats.opackets = 0;
-		stats.ibytes   -= port->stats.ibytes;
-		port->stats.ibytes = 0;
-		stats.obytes   -= port->stats.obytes;
-		port->stats.obytes = 0;
-		stats.imissed  -= port->stats.imissed;
-		port->stats.imissed = 0;
-		stats.oerrors  -= port->stats.oerrors;
-		port->stats.oerrors = 0;
-		stats.rx_nombuf -= port->stats.rx_nombuf;
-		port->stats.rx_nombuf = 0;
-
-		total_recv += stats.ipackets;
-		total_xmit += stats.opackets;
-		total_rx_dropped += stats.imissed;
-		total_tx_dropped += port->tx_dropped;
-		total_rx_nombuf  += stats.rx_nombuf;
 
-		fwd_port_stats_display(pt_id, &stats);
-	}
+	fwd_stats_display();
 
-	printf("\n  %s Accumulated forward statistics for all ports"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
-	       "%-"PRIu64"\n"
-	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
-	       "%-"PRIu64"\n",
-	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
-	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
-	if (total_rx_nombuf > 0)
-		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
-	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
-	       "%s\n",
-	       acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-	if (total_recv > 0)
-		printf("\n  CPU cycles/packet=%u (total cycles="
-		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
-		       (unsigned int)(fwd_cycles / total_recv),
-		       fwd_cycles, total_recv);
-#endif
 	printf("\nDone.\n");
 	test_done = 1;
 }
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 4f4a48f..f43b1a7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -164,19 +164,12 @@ struct rte_port {
 	struct rte_eth_conf     dev_conf;   /**< Port configuration. */
 	struct ether_addr       eth_addr;   /**< Port ethernet address */
 	struct rte_eth_stats    stats;      /**< Last port statistics */
-	uint64_t                tx_dropped; /**< If no descriptor in TX ring */
-	struct fwd_stream       *rx_stream; /**< Port RX stream, if unique */
-	struct fwd_stream       *tx_stream; /**< Port TX stream, if unique */
 	unsigned int            socket_id;  /**< For NUMA support */
 	uint16_t		parse_tunnel:1; /**< Parse internal headers */
 	uint16_t                tso_segsz;  /**< Segmentation offload MSS for non-tunneled packets. */
 	uint16_t                tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */
 	uint16_t                tx_vlan_id;/**< The tag ID */
 	uint16_t                tx_vlan_id_outer;/**< The outer tag ID */
-	uint64_t                rx_bad_ip_csum; /**< rx pkts with bad ip checksum  */
-	uint64_t                rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */
-	uint64_t                rx_bad_outer_l4_csum;
-	/**< rx pkts with bad outer l4 checksum */
 	uint8_t                 tx_queue_stats_mapping_enabled;
 	uint8_t                 rx_queue_stats_mapping_enabled;
 	volatile uint16_t        port_status;    /**< port started or not */
@@ -767,6 +760,8 @@ void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
 char *list_pkt_forwarding_retry_modes(void);
 void set_pkt_forwarding_mode(const char *fwd_mode);
 void start_packet_forwarding(int with_tx_first);
+void fwd_stats_display(void);
+void fwd_stats_reset(void);
 void stop_packet_forwarding(void);
 void dev_set_link_up(portid_t pid);
 void dev_set_link_down(portid_t pid);
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 1a12da4..06c8b2a 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -336,6 +336,42 @@ Example::
    Set rxonly packet forwarding mode
 
 
+show fwd
+~~~~~~~~
+
+When running, forwarding engines maintain statistics from the time they have been started.
+Example for the io forwarding engine, with some packet drops on the tx side::
+
+   testpmd> show fwd stats all
+
+     ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
+     RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128
+
+     ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
+     RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0
+
+     ---------------------- Forward statistics for port 0  ----------------------
+     RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
+     TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
+     TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
+     TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+clear fwd
+~~~~~~~~~
+
+Clear the forwarding engines statistics::
+
+   testpmd> clear fwd stats all
+
 read rxd
 ~~~~~~~~
 
-- 
1.8.3.1


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

* Re: [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics David Marchand
  2019-03-25  8:51           ` David Marchand
@ 2019-03-25  8:55           ` Andrew Rybchenko
  2019-03-25  8:55             ` Andrew Rybchenko
  1 sibling, 1 reply; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-25  8:55 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose,
	maxime.coquelin, ferruh.yigit, stable

On 3/25/19 11:51 AM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
> iofwd engine
>    RX-packets: 121811360      TX-packets: 121811392      TX-dropped: 0               RX-bursts : 3806605 [100% of 32 pkts]
>    TX-bursts : 3806606 [100% of 32 pkts]
>
> csum engine
>    RX-packets: 5467488        TX-packets: 5467520        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 170859 [100% of 32 pkts]
>    TX-bursts : 170860 [100% of 32 pkts]
>
> After:
> iofwd engine
>    RX-packets: 259770560      TX-packets: 259770592      TX-dropped: 0
>    RX-bursts : 8117830 [100% of 32 pkts]
>    TX-bursts : 8117831 [100% of 32 pkts]
>
> csum engine
>    RX-packets: 7834016        TX-packets: 7834048        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 244813 [100% of 32 pkts]
>    TX-bursts : 244814 [100% of 32 pkts]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>

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

* Re: [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics
  2019-03-25  8:55           ` Andrew Rybchenko
@ 2019-03-25  8:55             ` Andrew Rybchenko
  0 siblings, 0 replies; 109+ messages in thread
From: Andrew Rybchenko @ 2019-03-25  8:55 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose,
	maxime.coquelin, ferruh.yigit, stable

On 3/25/19 11:51 AM, David Marchand wrote:
> Having the standard stats and the rx burst stats on the same line gives a
> really long line and is not consistent with the rest.
>
> Before:
> iofwd engine
>    RX-packets: 121811360      TX-packets: 121811392      TX-dropped: 0               RX-bursts : 3806605 [100% of 32 pkts]
>    TX-bursts : 3806606 [100% of 32 pkts]
>
> csum engine
>    RX-packets: 5467488        TX-packets: 5467520        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 170859 [100% of 32 pkts]
>    TX-bursts : 170860 [100% of 32 pkts]
>
> After:
> iofwd engine
>    RX-packets: 259770560      TX-packets: 259770592      TX-dropped: 0
>    RX-bursts : 8117830 [100% of 32 pkts]
>    TX-bursts : 8117831 [100% of 32 pkts]
>
> csum engine
>    RX-packets: 7834016        TX-packets: 7834048        TX-dropped: 0               RX- bad IP checksum: 0               Rx- bad L4 checksum: 0              Rx- bad outer L4 checksum: 0
>    RX-bursts : 244813 [100% of 32 pkts]
>    TX-bursts : 244814 [100% of 32 pkts]
>
> Fixes: af75078fece3 ("first public release")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>


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

* Re: [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly
  2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
                           ` (4 preceding siblings ...)
  2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
@ 2019-03-25 14:05         ` Ferruh Yigit
  2019-03-25 14:05           ` Ferruh Yigit
  5 siblings, 1 reply; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-25 14:05 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin

On 3/25/2019 8:51 AM, David Marchand wrote:
> Here is a little series that makes it possible to display and clear
> testpmd fwd engines while they run without having to stop them.
> This is mostly handy when running stress tests and you look for packets
> drops without having to stop/start testpmd forwarding.
> 
> Example:
> 
> testpmd> show fwd stats all 
> 
>   ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
>   RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             
> 
>   ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
>   RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             
> 
>   ---------------------- Forward statistics for port 0  ----------------------
>   RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
>   TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
>   ----------------------------------------------------------------------------
> 
>   ---------------------- Forward statistics for port 1  ----------------------
>   RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
>   TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
>   ----------------------------------------------------------------------------
> 
>   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
>   RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
>   TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
>   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 
> testpmd> show fwd stats all 
> 
>   ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
>   RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           
> 
>   ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
>   RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             
> 
>   ---------------------- Forward statistics for port 0  ----------------------
>   RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
>   TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
>   ----------------------------------------------------------------------------
> 
>   ---------------------- Forward statistics for port 1  ----------------------
>   RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
>   TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
>   ----------------------------------------------------------------------------
> 
>   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
>   RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
>   TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
>   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 

For series,
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Series applied to dpdk-next-net/master, thanks.

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

* Re: [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly
  2019-03-25 14:05         ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly Ferruh Yigit
@ 2019-03-25 14:05           ` Ferruh Yigit
  0 siblings, 0 replies; 109+ messages in thread
From: Ferruh Yigit @ 2019-03-25 14:05 UTC (permalink / raw)
  To: David Marchand, dev
  Cc: wenzhuo.lu, jingjing.wu, bernard.iremonger, ramirose, arybchenko,
	maxime.coquelin

On 3/25/2019 8:51 AM, David Marchand wrote:
> Here is a little series that makes it possible to display and clear
> testpmd fwd engines while they run without having to stop them.
> This is mostly handy when running stress tests and you look for packets
> drops without having to stop/start testpmd forwarding.
> 
> Example:
> 
> testpmd> show fwd stats all 
> 
>   ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
>   RX-packets: 261977064      TX-packets: 261977064      TX-dropped: 0             
> 
>   ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
>   RX-packets: 261985142      TX-packets: 261985142      TX-dropped: 0             
> 
>   ---------------------- Forward statistics for port 0  ----------------------
>   RX-packets: 261977096      RX-dropped: 0             RX-total: 261977096
>   TX-packets: 261985155      TX-dropped: 0             TX-total: 261985155
>   ----------------------------------------------------------------------------
> 
>   ---------------------- Forward statistics for port 1  ----------------------
>   RX-packets: 261985188      RX-dropped: 0             RX-total: 261985188
>   TX-packets: 261977128      TX-dropped: 0             TX-total: 261977128
>   ----------------------------------------------------------------------------
> 
>   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
>   RX-packets: 523962284      RX-dropped: 0             RX-total: 523962284
>   TX-packets: 523962283      TX-dropped: 0             TX-total: 523962283
>   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 
> testpmd> show fwd stats all 
> 
>   ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 1/Queue= 0 -------
>   RX-packets: 274293770      TX-packets: 274293642      TX-dropped: 128           
> 
>   ------- Forward Stats for RX Port= 1/Queue= 0 -> TX Port= 0/Queue= 0 -------
>   RX-packets: 274301850      TX-packets: 274301850      TX-dropped: 0             
> 
>   ---------------------- Forward statistics for port 0  ----------------------
>   RX-packets: 274293802      RX-dropped: 0             RX-total: 274293802
>   TX-packets: 274301862      TX-dropped: 0             TX-total: 274301862
>   ----------------------------------------------------------------------------
> 
>   ---------------------- Forward statistics for port 1  ----------------------
>   RX-packets: 274301894      RX-dropped: 0             RX-total: 274301894
>   TX-packets: 274293706      TX-dropped: 128           TX-total: 274293834
>   ----------------------------------------------------------------------------
> 
>   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
>   RX-packets: 548595696      RX-dropped: 0             RX-total: 548595696
>   TX-packets: 548595568      TX-dropped: 128           TX-total: 548595696
>   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 

For series,
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Series applied to dpdk-next-net/master, thanks.


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

end of thread, other threads:[~2019-03-25 14:05 UTC | newest]

Thread overview: 109+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-14 15:42 [dpdk-dev] [PATCH 0/5] display testpmd forwarding engine stats on the fly David Marchand
2019-02-14 15:42 ` [dpdk-dev] [PATCH 1/5] app/testpmd: remove unused fwd_ctx field David Marchand
2019-02-18 19:55   ` Rami Rosen
2019-02-14 15:42 ` [dpdk-dev] [PATCH 2/5] app/testpmd: add missing newline when showing statistics David Marchand
2019-02-19  5:48   ` Rami Rosen
2019-02-14 15:42 ` [dpdk-dev] [PATCH 3/5] app/testpmd: add missing transmit errors stats David Marchand
2019-02-14 16:30   ` Bruce Richardson
2019-02-14 17:39     ` David Marchand
2019-02-14 18:51       ` David Marchand
2019-02-15  8:57         ` Thomas Monjalon
2019-02-15  9:33           ` David Marchand
2019-02-15 14:05             ` Bruce Richardson
2019-02-15 14:13               ` Wiles, Keith
2019-02-15 15:04               ` David Marchand
2019-02-15 16:19                 ` Thomas Monjalon
2019-02-15 17:32                   ` David Marchand
2019-02-15 18:15                     ` Ananyev, Konstantin
2019-02-15 18:31                       ` David Marchand
2019-02-15 18:42                         ` Ananyev, Konstantin
2019-02-15 19:38                           ` Thomas Monjalon
2019-02-16  0:37                             ` Stephen Hemminger
2019-02-16 13:23                               ` Ananyev, Konstantin
2019-02-16 12:50                             ` Ananyev, Konstantin
2019-02-20  8:33                               ` David Marchand
2019-02-24 11:55                                 ` Ananyev, Konstantin
2019-02-14 15:42 ` [dpdk-dev] [PATCH 4/5] app/testpmd: remove useless casts on statistics David Marchand
2019-02-14 15:42 ` [dpdk-dev] [PATCH 5/5] app/testpmd: display/clear forwarding stats on demand David Marchand
2019-03-11 15:35 ` [dpdk-dev] [PATCH v2 0/4] display testpmd forwarding engine stats on the fly David Marchand
2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 1/4] app/testpmd: remove unused fwd_ctx field David Marchand
2019-03-19 18:29     ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2019-03-19 18:29       ` Ferruh Yigit
2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 2/4] app/testpmd: add missing newline when showing statistics David Marchand
2019-03-11 15:53     ` Andrew Rybchenko
2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 3/4] app/testpmd: remove useless casts on statistics David Marchand
2019-03-11 15:57     ` Andrew Rybchenko
2019-03-11 16:03       ` David Marchand
2019-03-11 15:35   ` [dpdk-dev] [PATCH v2 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
2019-03-20 10:02   ` [dpdk-dev] [PATCH v3 0/4] display testpmd forwarding engine stats on the fly David Marchand
2019-03-20 10:02     ` David Marchand
2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 1/4] app/testpmd: add missing newline when showing statistics David Marchand
2019-03-20 10:02       ` David Marchand
2019-03-20 13:49       ` Andrew Rybchenko
2019-03-20 13:49         ` Andrew Rybchenko
2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
2019-03-20 10:02       ` David Marchand
2019-03-20 13:55       ` Andrew Rybchenko
2019-03-20 13:55         ` Andrew Rybchenko
2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 3/4] app/testpmd: remove useless casts on statistics David Marchand
2019-03-20 10:02       ` David Marchand
2019-03-20 13:58       ` Andrew Rybchenko
2019-03-20 13:58         ` Andrew Rybchenko
2019-03-20 10:02     ` [dpdk-dev] [PATCH v3 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
2019-03-20 10:02       ` David Marchand
2019-03-20 12:25       ` Ferruh Yigit
2019-03-20 12:25         ` Ferruh Yigit
2019-03-20 12:44         ` David Marchand
2019-03-20 12:44           ` David Marchand
2019-03-20 13:29           ` Ferruh Yigit
2019-03-20 13:29             ` Ferruh Yigit
2019-03-21 18:50       ` Ferruh Yigit
2019-03-21 18:50         ` Ferruh Yigit
2019-03-21 20:34         ` David Marchand
2019-03-21 20:34           ` David Marchand
2019-03-22 13:37     ` [dpdk-dev] [PATCH v4 0/4] display testpmd forwarding engine stats on the fly David Marchand
2019-03-22 13:37       ` David Marchand
2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 1/4] app/testpmd: add missing newline when showing statistics David Marchand
2019-03-22 13:37         ` David Marchand
2019-03-22 17:03         ` Maxime Coquelin
2019-03-22 17:03           ` Maxime Coquelin
2019-03-22 17:17         ` Maxime Coquelin
2019-03-22 17:17           ` Maxime Coquelin
2019-03-22 17:23           ` David Marchand
2019-03-22 17:23             ` David Marchand
2019-03-22 17:31             ` Andrew Rybchenko
2019-03-22 17:31               ` Andrew Rybchenko
2019-03-22 17:35         ` Andrew Rybchenko
2019-03-22 17:35           ` Andrew Rybchenko
2019-03-22 17:43           ` David Marchand
2019-03-22 17:43             ` David Marchand
2019-03-23 19:12             ` David Marchand
2019-03-23 19:12               ` David Marchand
2019-03-25  6:34               ` Andrew Rybchenko
2019-03-25  6:34                 ` Andrew Rybchenko
2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
2019-03-22 13:37         ` David Marchand
2019-03-22 17:06         ` Maxime Coquelin
2019-03-22 17:06           ` Maxime Coquelin
2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 3/4] app/testpmd: remove useless casts on statistics David Marchand
2019-03-22 13:37         ` David Marchand
2019-03-22 17:11         ` Maxime Coquelin
2019-03-22 17:11           ` Maxime Coquelin
2019-03-22 13:37       ` [dpdk-dev] [PATCH v4 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
2019-03-22 13:37         ` David Marchand
2019-03-22 17:22         ` Maxime Coquelin
2019-03-22 17:22           ` Maxime Coquelin
2019-03-25  8:51       ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly David Marchand
2019-03-25  8:51         ` David Marchand
2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 1/4] app/testpmd: add missing newline when showing statistics David Marchand
2019-03-25  8:51           ` David Marchand
2019-03-25  8:55           ` Andrew Rybchenko
2019-03-25  8:55             ` Andrew Rybchenko
2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 2/4] app/testpmd: extend fwd statistics to 64bits David Marchand
2019-03-25  8:51           ` David Marchand
2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 3/4] app/testpmd: remove useless casts on statistics David Marchand
2019-03-25  8:51           ` David Marchand
2019-03-25  8:51         ` [dpdk-dev] [PATCH v5 4/4] app/testpmd: display/clear forwarding stats on demand David Marchand
2019-03-25  8:51           ` David Marchand
2019-03-25 14:05         ` [dpdk-dev] [PATCH v5 0/4] display testpmd forwarding engine stats on the fly Ferruh Yigit
2019-03-25 14:05           ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).