net/mlx5: fix xstats reset reinitialization
[dpdk.git] / drivers / net / mlx5 / mlx5_stats.c
index e30542e..82d4d4a 100644 (file)
@@ -17,6 +17,7 @@
 #include "mlx5_defs.h"
 #include "mlx5.h"
 #include "mlx5_rxtx.h"
+#include "mlx5_malloc.h"
 
 /**
  * DPDK callback to get extended device statistics.
@@ -216,8 +217,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 +228,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;
 }