net/cxgbe: fix port ID in Rx mbuf
[dpdk.git] / drivers / net / mlx5 / mlx5_stats.c
index e30542e..f64fa35 100644 (file)
@@ -8,7 +8,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
 #include <rte_common.h>
 #include <rte_malloc.h>
 
@@ -16,7 +16,9 @@
 
 #include "mlx5_defs.h"
 #include "mlx5.h"
-#include "mlx5_rxtx.h"
+#include "mlx5_rx.h"
+#include "mlx5_tx.h"
+#include "mlx5_malloc.h"
 
 /**
  * DPDK callback to get extended device statistics.
@@ -105,25 +107,30 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        memset(&tmp, 0, sizeof(tmp));
        /* Add software counters. */
        for (i = 0; (i != priv->rxqs_n); ++i) {
-               struct mlx5_rxq_data *rxq = (*priv->rxqs)[i];
+               struct mlx5_rxq_data *rxq = mlx5_rxq_data_get(dev, i);
 
                if (rxq == NULL)
                        continue;
                idx = rxq->idx;
                if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
 #ifdef MLX5_PMD_SOFT_COUNTERS
-                       tmp.q_ipackets[idx] += rxq->stats.ipackets;
-                       tmp.q_ibytes[idx] += rxq->stats.ibytes;
+                       tmp.q_ipackets[idx] += rxq->stats.ipackets -
+                               rxq->stats_reset.ipackets;
+                       tmp.q_ibytes[idx] += rxq->stats.ibytes -
+                               rxq->stats_reset.ibytes;
 #endif
                        tmp.q_errors[idx] += (rxq->stats.idropped +
-                                             rxq->stats.rx_nombuf);
+                                             rxq->stats.rx_nombuf) -
+                                             (rxq->stats_reset.idropped +
+                                             rxq->stats_reset.rx_nombuf);
                }
 #ifdef MLX5_PMD_SOFT_COUNTERS
-               tmp.ipackets += rxq->stats.ipackets;
-               tmp.ibytes += rxq->stats.ibytes;
+               tmp.ipackets += rxq->stats.ipackets - rxq->stats_reset.ipackets;
+               tmp.ibytes += rxq->stats.ibytes - rxq->stats_reset.ibytes;
 #endif
-               tmp.ierrors += rxq->stats.idropped;
-               tmp.rx_nombuf += rxq->stats.rx_nombuf;
+               tmp.ierrors += rxq->stats.idropped - rxq->stats_reset.idropped;
+               tmp.rx_nombuf += rxq->stats.rx_nombuf -
+                                       rxq->stats_reset.rx_nombuf;
        }
        for (i = 0; (i != priv->txqs_n); ++i) {
                struct mlx5_txq_data *txq = (*priv->txqs)[i];
@@ -133,15 +140,17 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
                idx = txq->idx;
                if (idx < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
 #ifdef MLX5_PMD_SOFT_COUNTERS
-                       tmp.q_opackets[idx] += txq->stats.opackets;
-                       tmp.q_obytes[idx] += txq->stats.obytes;
+                       tmp.q_opackets[idx] += txq->stats.opackets -
+                                               txq->stats_reset.opackets;
+                       tmp.q_obytes[idx] += txq->stats.obytes -
+                                               txq->stats_reset.obytes;
 #endif
                }
 #ifdef MLX5_PMD_SOFT_COUNTERS
-               tmp.opackets += txq->stats.opackets;
-               tmp.obytes += txq->stats.obytes;
+               tmp.opackets += txq->stats.opackets - txq->stats_reset.opackets;
+               tmp.obytes += txq->stats.obytes - txq->stats_reset.obytes;
 #endif
-               tmp.oerrors += txq->stats.oerrors;
+               tmp.oerrors += txq->stats.oerrors - txq->stats_reset.oerrors;
        }
        ret = mlx5_os_read_dev_stat(priv, "out_of_buffer", &tmp.imissed);
        if (ret == 0) {
@@ -179,16 +188,18 @@ mlx5_stats_reset(struct rte_eth_dev *dev)
        unsigned int i;
 
        for (i = 0; (i != priv->rxqs_n); ++i) {
-               if ((*priv->rxqs)[i] == NULL)
+               struct mlx5_rxq_data *rxq_data = mlx5_rxq_data_get(dev, i);
+
+               if (rxq_data == NULL)
                        continue;
-               memset(&(*priv->rxqs)[i]->stats, 0,
-                      sizeof(struct mlx5_rxq_stats));
+               rxq_data->stats_reset = rxq_data->stats;
        }
        for (i = 0; (i != priv->txqs_n); ++i) {
-               if ((*priv->txqs)[i] == NULL)
+               struct mlx5_txq_data *txq_data = (*priv->txqs)[i];
+
+               if (txq_data == NULL)
                        continue;
-               memset(&(*priv->txqs)[i]->stats, 0,
-                      sizeof(struct mlx5_txq_stats));
+               txq_data->stats_reset = txq_data->stats;
        }
        mlx5_os_read_dev_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base);
        stats_ctrl->imissed = 0;
@@ -216,8 +227,7 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)
        struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
        int stats_n;
        unsigned int i;
-       unsigned int n = xstats_ctrl->mlx5_stats_n;
-       uint64_t counters[n];
+       uint64_t *counters;
        int ret;
 
        stats_n = mlx5_os_get_stats_n(dev);
@@ -228,17 +238,29 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)
        }
        if (xstats_ctrl->stats_n != stats_n)
                mlx5_os_stats_init(dev);
+       counters =  mlx5_malloc(MLX5_MEM_SYS, sizeof(*counters) *
+                       xstats_ctrl->mlx5_stats_n, 0,
+                       SOCKET_ID_ANY);
+       if (!counters) {
+               DRV_LOG(WARNING, "port %u unable to allocate memory for xstats "
+                               "counters",
+                    dev->data->port_id);
+               rte_errno = ENOMEM;
+               return -rte_errno;
+       }
        ret = mlx5_os_read_dev_counters(dev, counters);
        if (ret) {
                DRV_LOG(ERR, "port %u cannot read device counters: %s",
                        dev->data->port_id, strerror(rte_errno));
+               mlx5_free(counters);
                return ret;
        }
-       for (i = 0; i != n; ++i) {
+       for (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) {
                xstats_ctrl->base[i] = counters[i];
                xstats_ctrl->hw_stats[i] = 0;
        }
        mlx5_txpp_xstats_reset(dev);
+       mlx5_free(counters);
        return 0;
 }