#include <stdio.h>
#include <unistd.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
#include <rte_common.h>
#include <rte_malloc.h>
#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.
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];
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) {
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;
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;
}