#include "mlx5_defs.h"
#include "mlx5.h"
#include "mlx5_rxtx.h"
+#include "mlx5_malloc.h"
/**
* DPDK callback to get extended device statistics.
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);
}
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;
}