diff options
author | Yevgeny Petrilin <yevgenyp@mellanox.co.il> | 2009-04-20 04:26:05 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-04-21 01:47:04 -0700 |
commit | 1e338db56e5a6a5bb93884c1fb3b0b9f01958f93 (patch) | |
tree | ae32849ed1d499aaaf06d2dcfb809e86a5095216 /drivers/net | |
parent | 9a4f92a603cd72ee534cead20cbc627b34cfc884 (diff) | |
download | op-kernel-dev-1e338db56e5a6a5bb93884c1fb3b0b9f01958f93.zip op-kernel-dev-1e338db56e5a6a5bb93884c1fb3b0b9f01958f93.tar.gz |
mlx4_en: Fix a race at restart task
The query whether the port is up or not should be done at
the execution of the restart task and not when it is queued.
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/mlx4/en_netdev.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index 303c23d..09fb7cf 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c @@ -348,11 +348,9 @@ static void mlx4_en_tx_timeout(struct net_device *dev) if (netif_msg_timer(priv)) mlx4_warn(mdev, "Tx timeout called on port:%d\n", priv->port); - if (netif_carrier_ok(dev)) { - priv->port_stats.tx_timeout++; - mlx4_dbg(DRV, priv, "Scheduling watchdog\n"); - queue_work(mdev->workqueue, &priv->watchdog_task); - } + priv->port_stats.tx_timeout++; + mlx4_dbg(DRV, priv, "Scheduling watchdog\n"); + queue_work(mdev->workqueue, &priv->watchdog_task); } @@ -761,9 +759,14 @@ static void mlx4_en_restart(struct work_struct *work) struct net_device *dev = priv->dev; mlx4_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); - mlx4_en_stop_port(dev); - if (mlx4_en_start_port(dev)) - mlx4_err(mdev, "Failed restarting port %d\n", priv->port); + + mutex_lock(&mdev->state_lock); + if (priv->port_up) { + mlx4_en_stop_port(dev); + if (mlx4_en_start_port(dev)) + mlx4_err(mdev, "Failed restarting port %d\n", priv->port); + } + mutex_unlock(&mdev->state_lock); } |