app/testpmd: enable empty polls in burst stats
authorHonnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Mon, 6 Jul 2020 23:32:31 +0000 (18:32 -0500)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 7 Jul 2020 21:38:28 +0000 (23:38 +0200)
The number of empty polls provides information about available
CPU head room in the presence of continuous polling.

Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Reviewed-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
Tested-by: Phil Yang <phil.yang@arm.com>
Tested-by: Ali Alnubani <alialnu@mellanox.com>
app/test-pmd/csumonly.c
app/test-pmd/icmpecho.c
app/test-pmd/iofwd.c
app/test-pmd/macfwd.c
app/test-pmd/macswap.c
app/test-pmd/rxonly.c
app/test-pmd/testpmd.c

index 8626223..0a96b24 100644 (file)
@@ -802,11 +802,12 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        /* receive a burst of packet */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        rx_bad_ip_csum = 0;
        rx_bad_l4_csum = 0;
index 65aece1..78e3adf 100644 (file)
@@ -308,12 +308,12 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
         */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
-
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        nb_replies = 0;
        for (i = 0; i < nb_rx; i++) {
index 9dce76e..22b59bb 100644 (file)
@@ -66,13 +66,13 @@ pkt_burst_io_forward(struct fwd_stream *fs)
         */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue,
                        pkts_burst, nb_pkt_per_burst);
+#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
+       fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
+#endif
        if (unlikely(nb_rx == 0))
                return;
        fs->rx_packets += nb_rx;
 
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-       fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
-#endif
        nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue,
                        pkts_burst, nb_rx);
        /*
index d2ebb11..0a89d94 100644 (file)
@@ -71,12 +71,12 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
         */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
-
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        txp = &ports[fs->tx_port];
        tx_offloads = txp->dev_conf.txmode.offloads;
index 8428c26..fbe8cb3 100644 (file)
@@ -72,12 +72,12 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
         */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
-
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        txp = &ports[fs->tx_port];
 
index 5c65fc4..18d59a6 100644 (file)
@@ -63,12 +63,12 @@ pkt_burst_receive(struct fwd_stream *fs)
         */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
-
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        for (i = 0; i < nb_rx; i++)
                rte_pktmbuf_free(pkts_burst[i]);
index 2e1493d..f5feb62 100644 (file)
@@ -1692,57 +1692,68 @@ init_fwd_streams(void)
 static void
 pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs)
 {
-       uint64_t total_burst;
+       uint64_t total_burst, sburst;
        uint64_t nb_burst;
-       uint64_t burst_stats[3];
-       uint16_t pktnb_stats[3];
+       uint64_t burst_stats[4];
+       uint16_t pktnb_stats[4];
        uint16_t nb_pkt;
-       int burst_percent[3];
+       int burst_percent[4], sburstp;
+       int i;
 
        /*
         * First compute the total number of packet bursts and the
         * two highest numbers of bursts of the same number of packets.
         */
-       total_burst = 0;
-       burst_stats[0] = burst_stats[1] = burst_stats[2] = 0;
-       pktnb_stats[0] = pktnb_stats[1] = pktnb_stats[2] = 0;
-       for (nb_pkt = 0; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
+       memset(&burst_stats, 0x0, sizeof(burst_stats));
+       memset(&pktnb_stats, 0x0, sizeof(pktnb_stats));
+
+       /* Show stats for 0 burst size always */
+       total_burst = pbs->pkt_burst_spread[0];
+       burst_stats[0] = pbs->pkt_burst_spread[0];
+       pktnb_stats[0] = 0;
+
+       /* Find the next 2 burst sizes with highest occurrences. */
+       for (nb_pkt = 1; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
                nb_burst = pbs->pkt_burst_spread[nb_pkt];
+
                if (nb_burst == 0)
                        continue;
+
                total_burst += nb_burst;
-               if (nb_burst > burst_stats[0]) {
-                       burst_stats[1] = burst_stats[0];
-                       pktnb_stats[1] = pktnb_stats[0];
-                       burst_stats[0] = nb_burst;
-                       pktnb_stats[0] = nb_pkt;
-               } else if (nb_burst > burst_stats[1]) {
+
+               if (nb_burst > burst_stats[1]) {
+                       burst_stats[2] = burst_stats[1];
+                       pktnb_stats[2] = pktnb_stats[1];
                        burst_stats[1] = nb_burst;
                        pktnb_stats[1] = nb_pkt;
+               } else if (nb_burst > burst_stats[2]) {
+                       burst_stats[2] = nb_burst;
+                       pktnb_stats[2] = nb_pkt;
                }
        }
        if (total_burst == 0)
                return;
-       burst_percent[0] = (double)burst_stats[0] / total_burst * 100;
-       printf("  %s-bursts : %"PRIu64" [%d%% of %d pkts", rx_tx, total_burst,
-              burst_percent[0], (int) pktnb_stats[0]);
-       if (burst_stats[0] == total_burst) {
-               printf("]\n");
-               return;
-       }
-       if (burst_stats[0] + burst_stats[1] == total_burst) {
-               printf(" + %d%% of %d pkts]\n",
-                      100 - burst_percent[0], pktnb_stats[1]);
-               return;
-       }
-       burst_percent[1] = (double)burst_stats[1] / total_burst * 100;
-       burst_percent[2] = 100 - (burst_percent[0] + burst_percent[1]);
-       if ((burst_percent[1] == 0) || (burst_percent[2] == 0)) {
-               printf(" + %d%% of others]\n", 100 - burst_percent[0]);
-               return;
+
+       printf("  %s-bursts : %"PRIu64" [", rx_tx, total_burst);
+       for (i = 0, sburst = 0, sburstp = 0; i < 4; i++) {
+               if (i == 3) {
+                       printf("%d%% of other]\n", 100 - sburstp);
+                       return;
+               }
+
+               sburst += burst_stats[i];
+               if (sburst == total_burst) {
+                       printf("%d%% of %d pkts]\n",
+                               100 - sburstp, (int) pktnb_stats[i]);
+                       return;
+               }
+
+               burst_percent[i] =
+                       (double)burst_stats[i] / total_burst * 100;
+               printf("%d%% of %d pkts + ",
+                       burst_percent[i], (int) pktnb_stats[i]);
+               sburstp += burst_percent[i];
        }
-       printf(" + %d%% of %d pkts + %d%% of others]\n",
-              burst_percent[1], (int) pktnb_stats[1], burst_percent[2]);
 }
 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */