ethdev: add pause frame counters for em/igb/ixgbe
authorIvan Boule <ivan.boule@6wind.com>
Thu, 27 Jun 2013 12:54:08 +0000 (14:54 +0200)
committerDavid Marchand <david.marchand@6wind.com>
Wed, 26 Feb 2014 10:07:28 +0000 (11:07 +0100)
Add into the `rte_eth_stats` data structure 4 (64-bit) counters
of XOFF/XON pause frames received and sent on a given port.

Update em, igb, and ixgbe drivers to return the value of the 4 XOFF/XON
counters through the `rte_eth_stats_get` function exported by the DPDK
API.

Display the value of the 4 XOFF/XON counters in the `testpmd` application.

Signed-off-by: Ivan Boule <ivan.boule@6wind.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
app/test-pmd/config.c
app/test-pmd/testpmd.c
lib/librte_ether/rte_ethdev.h
lib/librte_pmd_e1000/em_ethdev.c
lib/librte_pmd_e1000/igb_ethdev.c
lib/librte_pmd_ixgbe/ixgbe_ethdev.c

index 3a244f5..0816227 100644 (file)
@@ -166,6 +166,14 @@ nic_stats_display(portid_t port_id)
                }
        }
 
+       /* Display statistics of XON/XOFF pause frames, if any. */
+       if ((stats.tx_pause_xon  | stats.rx_pause_xon |
+            stats.tx_pause_xoff | stats.rx_pause_xoff) > 0) {
+               printf("  RX-XOFF:    %-10"PRIu64" RX-XON:    %-10"PRIu64"\n",
+                      stats.rx_pause_xoff, stats.rx_pause_xon);
+               printf("  TX-XOFF:    %-10"PRIu64" TX-XON:    %-10"PRIu64"\n",
+                      stats.tx_pause_xoff, stats.tx_pause_xon);
+       }
        printf("  %s############################%s\n",
               nic_stats_border, nic_stats_border);
 }
index dc852a9..6036490 100644 (file)
@@ -759,6 +759,16 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
                if (stats->rx_nombuf > 0)
                        printf("  RX-nombufs:%14"PRIu64"\n", stats->rx_nombuf);
        }
+
+       /* Display statistics of XON/XOFF pause frames, if any. */
+       if ((stats->tx_pause_xon  | stats->rx_pause_xon |
+            stats->tx_pause_xoff | stats->rx_pause_xoff) > 0) {
+               printf("  RX-XOFF:    %-14"PRIu64" RX-XON:     %-14"PRIu64"\n",
+                      stats->rx_pause_xoff, stats->rx_pause_xon);
+               printf("  TX-XOFF:    %-14"PRIu64" TX-XON:     %-14"PRIu64"\n",
+                      stats->tx_pause_xoff, stats->tx_pause_xon);
+       }
+
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        if (port->rx_stream)
                pkt_burst_stats_display("RX",
index 9b0924a..1ac4c5c 100644 (file)
@@ -192,6 +192,10 @@ struct rte_eth_stats {
        uint64_t rx_nombuf; /**< Total number of RX mbuf allocation failures. */
        uint64_t fdirmatch; /**< Total number of RX packets matching a filter. */
        uint64_t fdirmiss;  /**< Total number of RX packets not matching any filter. */
+       uint64_t tx_pause_xon;  /**< Total nb. of XON pause frame sent. */
+       uint64_t rx_pause_xon;  /**< Total nb. of XON pause frame received. */
+       uint64_t tx_pause_xoff; /**< Total nb. of XOFF pause frame sent. */
+       uint64_t rx_pause_xoff; /**< Total nb. of XOFF pause frame received. */
        uint64_t q_ipackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
        /**< Total number of queue RX packets. */
        uint64_t q_opackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
index 77cf39d..d8c9a9b 100644 (file)
@@ -802,6 +802,12 @@ eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
        rte_stats->opackets = stats->gptc;
        rte_stats->ibytes   = stats->gorc;
        rte_stats->obytes   = stats->gotc;
+
+       /* XON/XOFF pause frames stats registers */
+       rte_stats->tx_pause_xon  = stats->xontxc;
+       rte_stats->rx_pause_xon  = stats->xonrxc;
+       rte_stats->tx_pause_xoff = stats->xofftxc;
+       rte_stats->rx_pause_xoff = stats->xoffrxc;
 }
 
 static void
index 9ac3340..184e7d6 100644 (file)
@@ -1023,6 +1023,12 @@ eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
        /* Tx Errors */
        rte_stats->oerrors = stats->ecol + stats->latecol;
 
+       /* XON/XOFF pause frames */
+       rte_stats->tx_pause_xon  = stats->xontxc;
+       rte_stats->rx_pause_xon  = stats->xonrxc;
+       rte_stats->tx_pause_xoff = stats->xofftxc;
+       rte_stats->rx_pause_xoff = stats->xoffrxc;
+
        rte_stats->ipackets = stats->gprc;
        rte_stats->opackets = stats->gptc;
        rte_stats->ibytes   = stats->gorc;
index 82c5542..fdf6c1d 100644 (file)
@@ -1607,6 +1607,12 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
        stats->oerrors  = 0;
 
+       /* XON/XOFF pause frames */
+       stats->tx_pause_xon  = hw_stats->lxontxc;
+       stats->rx_pause_xon  = hw_stats->lxonrxc;
+       stats->tx_pause_xoff = hw_stats->lxofftxc;
+       stats->rx_pause_xoff = hw_stats->lxoffrxc;
+
        /* Flow Director Stats registers */
        hw_stats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH);
        hw_stats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS);