Skip to content

Commit

Permalink
net/mlx5: fix xstats reset reinitialization
Browse files Browse the repository at this point in the history
[ upstream commit 42dcd45 ]

The mlx5_xstats_reset clears the device extended statistics.
In this function the driver may reinitialize the structures
that are used to read device counters.

In case of reinitialization, the number of counters may
change, which wouldn't be taken into account by the
reset API callback and can cause a segmentation fault.

This issue is fixed by allocating the counters size after
the reinitialization.

Fixes: a4193ae ("net/mlx5: support extended statistics")

Reported-by: Ralf Hoffmann <ralf.hoffmann@allegro-packets.com>
Signed-off-by: Shiri Kuzin <shirik@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
  • Loading branch information
Shiri Kuzin authored and bluca committed Nov 9, 2020
1 parent f9f235f commit d0f1f4b
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions drivers/net/mlx5/mlx5_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,8 +536,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_ethtool_get_stats_n(dev);
Expand All @@ -548,17 +547,26 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)
}
if (xstats_ctrl->stats_n != stats_n)
mlx5_stats_init(dev);
counters = malloc(sizeof(*counters) * xstats_ctrl->mlx5_stats_n);
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_read_dev_counters(dev, counters);
if (ret) {
DRV_LOG(ERR, "port %u cannot read device counters: %s",
dev->data->port_id, strerror(rte_errno));
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;
}

free(counters);
return 0;
}

Expand Down

0 comments on commit d0f1f4b

Please sign in to comment.