X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx5%2Fmlx5_stats.c;h=703f48c3a0c97a6444b6a494735600f3e4bc8f77;hb=adce1f86f8d25fc10e9ac32fd59fa0bedce608ad;hp=a2118418d5d4b68be09baef0846ca7e3ef4ca2d1;hpb=cd89f22a1e9770d312cac03c10705d48e5e36b4b;p=dpdk.git diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c index a2118418d5..703f48c3a0 100644 --- a/drivers/net/mlx5/mlx5_stats.c +++ b/drivers/net/mlx5/mlx5_stats.c @@ -175,6 +175,29 @@ priv_read_dev_counters(struct priv *priv, uint64_t *stats) return 0; } +/** + * Query the number of statistics provided by ETHTOOL. + * + * @param priv + * Pointer to private structure. + * + * @return + * Number of statistics on success, -1 on error. + */ +static int +priv_ethtool_get_stats_n(struct priv *priv) { + struct ethtool_drvinfo drvinfo; + struct ifreq ifr; + + drvinfo.cmd = ETHTOOL_GDRVINFO; + ifr.ifr_data = (caddr_t)&drvinfo; + if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) { + WARN("unable to query number of statistics"); + return -1; + } + return drvinfo.n_stats; +} + /** * Init the structures to read device counters. * @@ -188,19 +211,11 @@ priv_xstats_init(struct priv *priv) unsigned int i; unsigned int j; struct ifreq ifr; - struct ethtool_drvinfo drvinfo; struct ethtool_gstrings *strings = NULL; unsigned int dev_stats_n; unsigned int str_sz; - /* How many statistics are available. */ - drvinfo.cmd = ETHTOOL_GDRVINFO; - ifr.ifr_data = (caddr_t)&drvinfo; - if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) { - WARN("unable to get driver info"); - return; - } - dev_stats_n = drvinfo.n_stats; + dev_stats_n = priv_ethtool_get_stats_n(priv); if (dev_stats_n < 1) { WARN("no extended statistics available"); return; @@ -238,7 +253,7 @@ priv_xstats_init(struct priv *priv) } } for (j = 0; j != xstats_n; ++j) { - if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name)) + if (priv_is_ib_cntr(mlx5_counters_init[j].ctr_name)) continue; if (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) { WARN("counter \"%s\" is not recognized", @@ -422,7 +437,15 @@ mlx5_xstats_get(struct rte_eth_dev *dev, int ret = xstats_n; if (n >= xstats_n && stats) { + struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl; + int stats_n; + priv_lock(priv); + stats_n = priv_ethtool_get_stats_n(priv); + if (stats_n < 0) + return -1; + if (xstats_ctrl->stats_n != stats_n) + priv_xstats_init(priv); ret = priv_xstats_get(priv, stats); priv_unlock(priv); } @@ -439,8 +462,15 @@ void mlx5_xstats_reset(struct rte_eth_dev *dev) { struct priv *priv = mlx5_get_priv(dev); + struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl; + int stats_n; priv_lock(priv); + stats_n = priv_ethtool_get_stats_n(priv); + if (stats_n < 0) + return; + if (xstats_ctrl->stats_n != stats_n) + priv_xstats_init(priv); priv_xstats_reset(priv); priv_unlock(priv); }