[BNX2]: Fix rtnl deadlock in bnx2_close
authorMichael Chan <mchan@broadcom.com>
Thu, 25 Aug 2005 22:34:29 +0000 (15:34 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 29 Aug 2005 23:10:29 +0000 (16:10 -0700)
commitafdc08b9f9a7174d7912a160f657f39d46379b5e
tree04856840d578c029c8c675130ba93bd607bcaa1e
parent2373ce1ca04dd46bf2b8b0f9a799eb2a90da92fb
[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>
drivers/net/bnx2.c
drivers/net/bnx2.h