net/mlx4_en: Fix a race between napi poll function and RX ring cleanup
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / en_netdev.c
index f256a73..f1dcddc 100644 (file)
@@ -1635,6 +1635,9 @@ void mlx4_en_stop_port(struct net_device *dev, int detach)
                return;
        }
 
+       /* close port*/
+       mlx4_CLOSE_PORT(mdev->dev, priv->port);
+
        /* Synchronize with tx routine */
        netif_tx_lock_bh(dev);
        if (detach)
@@ -1735,14 +1738,11 @@ void mlx4_en_stop_port(struct net_device *dev, int detach)
                }
                local_bh_enable();
 
-               mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
                while (test_bit(NAPI_STATE_SCHED, &cq->napi.state))
                        msleep(1);
+               mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
                mlx4_en_deactivate_cq(priv, cq);
        }
-
-       /* close port*/
-       mlx4_CLOSE_PORT(mdev->dev, priv->port);
 }
 
 static void mlx4_en_restart(struct work_struct *work)