b43: Fix lockdep splat on module unload
authorLarry Finger <Larry.Finger@lwfinger.net>
Mon, 25 Feb 2013 06:09:24 +0000 (06:09 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Feb 2013 20:47:41 +0000 (15:47 -0500)
commit63a02ce1c5c59baa40b99756492e3ec8d6b51483
tree2fe50a19d82bb27b536d34a0aee5bad7b8fcf686
parent7992ae6df9733677fcc2e63c40b97854c605c399
b43: Fix lockdep splat on module unload

On unload, b43 produces a lockdep warning that can be summarized in the
following way:

 ======================================================
 [ INFO: possible circular locking dependency detected ]
 3.8.0-wl+ #117 Not tainted
 -------------------------------------------------------
 modprobe/5557 is trying to acquire lock:
  ((&wl->firmware_load)){+.+.+.}, at: [<ffffffff81062160>] flush_work+0x0/0x2a0

 but task is already holding lock:
  (rtnl_mutex){+.+.+.}, at: [<ffffffff813bd7d2>] rtnl_lock+0x12/0x20

 which lock already depends on the new lock.
 [ INFO: possible circular locking dependency detected ]
 ======================================================

The full output is available at http://lkml.indiana.edu/hypermail/linux/kernel/1302.3/00060.html.
To summarize, commit 6b6fa58 added a 'cancel_work_sync(&wl->firmware_load)'
call in the wrong place.

The fix is to move the cancel_work_sync() call to b43_bcma_remove() and
b43_ssb_remove(). Thanks to Johannes Berg and Michael Buesch for help in
diagnosing the log output.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Stable <stable@vger.kernel.org> [V3.5+]
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/wireless/b43/main.c