net/ena: add Tx drops statistic
authorMichal Krawczyk <mk@semihalf.com>
Wed, 8 Apr 2020 08:29:12 +0000 (10:29 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Apr 2020 11:57:07 +0000 (13:57 +0200)
ENA device can report in the AENQ handler amount of Tx packets that were
dropped and not sent.

This statistic is showing global value for the device and because
rte_eth_stats is missing field that could indicate this value (it
isn't the Tx error), it is being presented as a extended statistic.

As the current design of extended statistics prevents tx_drops from
being an atomic variable and both tx_drops and rx_drops are only updated
from the AENQ handler, both were set as non-atomic for the alignment.

Signed-off-by: Michal Krawczyk <mk@semihalf.com>
Reviewed-by: Igor Chauskin <igorch@amazon.com>
Reviewed-by: Guy Tzalik <gtzalik@amazon.com>
doc/guides/rel_notes/release_20_05.rst
drivers/net/ena/ena_ethdev.c
drivers/net/ena/ena_ethdev.h

index 4117ba3..e0cdf18 100644 (file)
@@ -87,6 +87,7 @@ New Features
   Updated ena PMD with new features and improvements, including:
 
   * Added support for large LLQ (Low-latency queue) headers.
+  * Added Tx drops as new extended driver statistic.
 
 * **Updated Intel i40e driver.**
 
index 07feb62..0d4523c 100644 (file)
@@ -96,6 +96,7 @@ static const struct ena_stats ena_stats_global_strings[] = {
        ENA_STAT_GLOBAL_ENTRY(wd_expired),
        ENA_STAT_GLOBAL_ENTRY(dev_start),
        ENA_STAT_GLOBAL_ENTRY(dev_stop),
+       ENA_STAT_GLOBAL_ENTRY(tx_drops),
 };
 
 static const struct ena_stats ena_stats_tx_strings[] = {
@@ -938,7 +939,7 @@ static void ena_stats_restart(struct rte_eth_dev *dev)
        rte_atomic64_init(&adapter->drv_stats->ierrors);
        rte_atomic64_init(&adapter->drv_stats->oerrors);
        rte_atomic64_init(&adapter->drv_stats->rx_nombuf);
-       rte_atomic64_init(&adapter->drv_stats->rx_drops);
+       adapter->drv_stats->rx_drops = 0;
 }
 
 static int ena_stats_get(struct rte_eth_dev *dev,
@@ -972,7 +973,7 @@ static int ena_stats_get(struct rte_eth_dev *dev,
                                        ena_stats.tx_bytes_low);
 
        /* Driver related stats */
-       stats->imissed = rte_atomic64_read(&adapter->drv_stats->rx_drops);
+       stats->imissed = adapter->drv_stats->rx_drops;
        stats->ierrors = rte_atomic64_read(&adapter->drv_stats->ierrors);
        stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors);
        stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf);
@@ -2785,12 +2786,16 @@ static void ena_keep_alive(void *adapter_data,
        struct ena_adapter *adapter = adapter_data;
        struct ena_admin_aenq_keep_alive_desc *desc;
        uint64_t rx_drops;
+       uint64_t tx_drops;
 
        adapter->timestamp_wd = rte_get_timer_cycles();
 
        desc = (struct ena_admin_aenq_keep_alive_desc *)aenq_e;
        rx_drops = ((uint64_t)desc->rx_drops_high << 32) | desc->rx_drops_low;
-       rte_atomic64_set(&adapter->drv_stats->rx_drops, rx_drops);
+       tx_drops = ((uint64_t)desc->tx_drops_high << 32) | desc->tx_drops_low;
+
+       adapter->drv_stats->rx_drops = rx_drops;
+       adapter->dev_stats.tx_drops = tx_drops;
 }
 
 /**
index ed3674b..5afce25 100644 (file)
@@ -134,13 +134,19 @@ struct ena_driver_stats {
        rte_atomic64_t ierrors;
        rte_atomic64_t oerrors;
        rte_atomic64_t rx_nombuf;
-       rte_atomic64_t rx_drops;
+       u64 rx_drops;
 };
 
 struct ena_stats_dev {
        u64 wd_expired;
        u64 dev_start;
        u64 dev_stop;
+       /*
+        * Tx drops cannot be reported as the driver statistic, because DPDK
+        * rte_eth_stats structure isn't providing appropriate field for that.
+        * As a workaround it is being published as an extended statistic.
+        */
+       u64 tx_drops;
 };
 
 struct ena_offloads {