Skip to content
  • Michael Chan's avatar
    [BNX2]: Fix rtnl deadlock in bnx2_close · afdc08b9
    Michael Chan authored
    
    
    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: default avatarMichael Chan <mchan@broadcom.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    afdc08b9