diff options
author | Michael Chan <mchan@broadcom.com> | 2005-08-25 18:34:29 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2005-08-29 19:10:29 -0400 |
commit | afdc08b9f9a7174d7912a160f657f39d46379b5e (patch) | |
tree | 04856840d578c029c8c675130ba93bd607bcaa1e /drivers/net/bnx2.h | |
parent | 2373ce1ca04dd46bf2b8b0f9a799eb2a90da92fb (diff) |
[BNX2]: Fix rtnl deadlock in bnx2_close
This fixes an rtnl deadlock problem when flush_scheduled_work() is
called from bnx2_close(). In rare cases, linkwatch_event() may be on
the workqueue from a previous close of a different device and it will
try to get the rtnl lock which is already held by dev_close().
The fix is to set a flag if we are in the reset task which is run
from the workqueue. bnx2_close() will loop until the flag is cleared.
As suggested by Jeff Garzik, the loop is changed to call msleep(1)
instead of yield() in the original patch.
flush_scheduled_work() is also moved to bnx2_remove_one() before the
netdev is freed.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bnx2.h')
-rw-r--r-- | drivers/net/bnx2.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 8214a2853d0d..63b94ca0018b 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -3874,6 +3874,7 @@ struct bnx2 { | |||
3874 | int timer_interval; | 3874 | int timer_interval; |
3875 | struct timer_list timer; | 3875 | struct timer_list timer; |
3876 | struct work_struct reset_task; | 3876 | struct work_struct reset_task; |
3877 | int in_reset_task; | ||
3877 | 3878 | ||
3878 | /* Used to synchronize phy accesses. */ | 3879 | /* Used to synchronize phy accesses. */ |
3879 | spinlock_t phy_lock; | 3880 | spinlock_t phy_lock; |