staging: brcm80211: fix rtnl_lock issue when bringing down brcmfmac
authorArend van Spriel <arend@broadcom.com>
Tue, 23 Aug 2011 12:13:57 +0000 (14:13 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 23 Aug 2011 20:10:14 +0000 (13:10 -0700)
When bringing down the netdevice interface a deadlock occurred
sporadically due to the rtnl_lock being held by a task that was
waiting for another task trying to get the lock. This patch fixes
that issue.

Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c

index 6c604cf627d517e20ae1f47c3257de875c94c814..80bb30a8a762208b72d69165ba76400a7c5813a3 100644 (file)
@@ -3189,7 +3189,14 @@ static void brcmf_term_iscan(struct brcmf_cfg80211_priv *cfg_priv)
        if (cfg_priv->iscan_on && iscan->tsk) {
                iscan->state = WL_ISCAN_STATE_IDLE;
                send_sig(SIGTERM, iscan->tsk, 1);
+
+               /*
+                * The iscan task may want to acquire the rtnl_lock
+                * so release it here upon stopping the task.
+                */
+               rtnl_unlock();
                kthread_stop(iscan->tsk);
+               rtnl_lock();
                iscan->tsk = NULL;
 
                /* Abort iscan running in FW */