mlx4: use READ_ONCE/WRITE_ONCE for ring indexes
authorJakub Kicinski <kuba@kernel.org>
Wed, 12 Apr 2023 01:50:38 +0000 (18:50 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 13 Apr 2023 11:30:22 +0000 (13:30 +0200)
Eric points out that we should make sure that ring index updates
are wrapped in the appropriate READ_ONCE/WRITE_ONCE macros.

Suggested-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx4/en_tx.c

index 2f79378fbf6ec106bf78d0fd12e911ff200ba8d7..65cb63f6c4658755ef945d1fc7dbb245a33df1f7 100644 (file)
@@ -228,7 +228,9 @@ void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv,
 
 static inline bool mlx4_en_is_tx_ring_full(struct mlx4_en_tx_ring *ring)
 {
-       return ring->prod - ring->cons > ring->full_size;
+       u32 used = READ_ONCE(ring->prod) - READ_ONCE(ring->cons);
+
+       return used > ring->full_size;
 }
 
 static void mlx4_en_stamp_wqe(struct mlx4_en_priv *priv,
@@ -1083,7 +1085,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
                        op_own |= cpu_to_be32(MLX4_WQE_CTRL_IIP);
        }
 
-       ring->prod += nr_txbb;
+       WRITE_ONCE(ring->prod, ring->prod + nr_txbb);
 
        /* If we used a bounce buffer then copy descriptor back into place */
        if (unlikely(bounce))
@@ -1214,7 +1216,7 @@ netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring,
 
        rx_ring->xdp_tx++;
 
-       ring->prod += MLX4_EN_XDP_TX_NRTXBB;
+       WRITE_ONCE(ring->prod, ring->prod + MLX4_EN_XDP_TX_NRTXBB);
 
        /* Ensure new descriptor hits memory
         * before setting ownership of this descriptor to HW