On Wed, 2016-11-30 at 22:42 +0200, Saeed Mahameed wrote: > On Wed, Nov 30, 2016 at 7:35 PM, Eric Dumazet <eric.duma...@gmail.com> wrote: > > On Wed, 2016-11-30 at 18:46 +0200, Saeed Mahameed wrote: > > > >> we had/still have the proper stats they are the ones that > >> mlx4_en_fold_software_stats is trying to cache into (they always > >> exist), > >> but the ones that you are trying to read from (the mlx4 rings) are gone ! > >> > >> This bug is totally new and as i warned, this is another symptom of > >> the real root cause (can't sleep while reading stats). > >> > >> Eric what do you suggest ? Keep pre-allocated MAX_RINGS stats and > >> always iterate over all of them to query stats ? > >> what if you have one ring/none/1K ? how would you know how many to query ? > > > > I am suggesting I will fix the bug I introduced. > > > > Do not panic. > > > > > > Not at all, I trust you are the only one who is capable of providing > the best solution. > I am just trying to read your mind :-). > > As i said i like the solution and i want to adapt it to mlx5, so I am > a little bit enthusiastic :)
What about the following fix guys ? As a bonus we update the stats right before they are sent to monitors via rtnetlink ;) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 12ea3405f442717478bf0e8882edaf0de77986cb..091b904262bc7932d3edf99cf850affb23b9ce6e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -1809,8 +1809,12 @@ void mlx4_en_stop_port(struct net_device *dev, int detach) netif_tx_disable(dev); + spin_lock_bh(&priv->stats_lock); + mlx4_en_fold_software_stats(dev); /* Set port as not active */ priv->port_up = false; + spin_unlock_bh(&priv->stats_lock); + priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev); /* Promsicuous mode */ diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c index c6c4f1238923e09eced547454b86c68720292859..9166d90e732858610b1407fe85cbf6cbe27f5e0b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_port.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c @@ -154,7 +154,7 @@ void mlx4_en_fold_software_stats(struct net_device *dev) unsigned long packets, bytes; int i; - if (mlx4_is_master(mdev->dev)) + if (!priv->port_up || mlx4_is_master(mdev->dev)) return; packets = 0;