summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath6kl/cfg80211.c
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan2011-11-01 12:08:50 +0100
committerKalle Valo2011-11-11 11:59:00 +0100
commit11f6e40d9f21767a9090e4e559d3c63edf25e6c0 (patch)
treec3fd39804436cc897756271f3fd1e6ba0d2a53db /drivers/net/wireless/ath/ath6kl/cfg80211.c
parentath6kl: cut power during suspend (diff)
downloadkernel-qcow2-linux-11f6e40d9f21767a9090e4e559d3c63edf25e6c0.tar.gz
kernel-qcow2-linux-11f6e40d9f21767a9090e4e559d3c63edf25e6c0.tar.xz
kernel-qcow2-linux-11f6e40d9f21767a9090e4e559d3c63edf25e6c0.zip
ath6kl: Fix lockdep warning
The following is the lockdep warning which detects possible deadlock condition with the way ar->lock and ar->list_lock are being used. (&(&ar->lock)->rlock){+.-...}, at: [<ffffffffa0492d13>] ath6kl_indicate_tx_activity+0x83/0x110 [ath6kl] but this lock took another, SOFTIRQ-unsafe lock in the past: (&(&ar->list_lock)->rlock){+.+...} and interrupts could create inverse lock ordering between them. other info that might help us debug this: Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&(&ar->list_lock)->rlock); local_irq_disable(); lock(&(&ar->lock)->rlock); lock(&(&ar->list_lock)->rlock); <Interrupt> lock(&(&ar->lock)->rlock); *** DEADLOCK *** softirqs have to be disabled when acquiring ar->list_lock to avoid the above deadlock condition. When the above warning printed the interface is still up and running without issue. Reported-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath6kl/cfg80211.c')
-rw-r--r--drivers/net/wireless/ath/ath6kl/cfg80211.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index 5dab4f20146a..4a880b4dda5b 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -1320,9 +1320,9 @@ static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
struct ath6kl *ar = wiphy_priv(wiphy);
struct ath6kl_vif *vif = netdev_priv(ndev);
- spin_lock(&ar->list_lock);
+ spin_lock_bh(&ar->list_lock);
list_del(&vif->list);
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag));
@@ -2437,9 +2437,9 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
if (type == NL80211_IFTYPE_ADHOC)
ar->ibss_if_active = true;
- spin_lock(&ar->list_lock);
+ spin_lock_bh(&ar->list_lock);
list_add_tail(&vif->list, &ar->vif_list);
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
return ndev;