From: Eric Dumazet <eduma...@google.com>

Per RX ring packets/bytes counters are not protected by global
priv->stats_lock.

Better not confuse the reader, and use READ_ONCE() to show we read
these counters without surrounding synchronization.

Interrupt moderation is best effort, and we do not really care of
ultra precise counters.

Signed-off-by: Eric Dumazet <eduma...@google.com>
---
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c |    6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c 
b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 
9a807e93c9fdd81e61e561208aa1480a244d0bdb..b964bdcd4ae509a7e693215e8b32f040218e252c
 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1391,10 +1391,8 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv 
*priv)
                return;
 
        for (ring = 0; ring < priv->rx_ring_num; ring++) {
-               spin_lock_bh(&priv->stats_lock);
-               rx_packets = priv->rx_ring[ring]->packets;
-               rx_bytes = priv->rx_ring[ring]->bytes;
-               spin_unlock_bh(&priv->stats_lock);
+               rx_packets = READ_ONCE(priv->rx_ring[ring]->packets);
+               rx_bytes = READ_ONCE(priv->rx_ring[ring]->bytes);
 
                rx_pkt_diff = ((unsigned long) (rx_packets -
                                priv->last_moder_packets[ring]));


Reply via email to