summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/ath/ath6kl/txrx.c
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>2011-11-01 11:08:50 (GMT)
committerKalle Valo <kvalo@qca.qualcomm.com>2011-11-11 10:59:00 (GMT)
commit11f6e40d9f21767a9090e4e559d3c63edf25e6c0 (patch)
treec3fd39804436cc897756271f3fd1e6ba0d2a53db /drivers/net/wireless/ath/ath6kl/txrx.c
parentb4b2a0b116d79510640622a5f28f219065e61b03 (diff)
downloadlinux-11f6e40d9f21767a9090e4e559d3c63edf25e6c0.tar.xz
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/txrx.c')
-rw-r--r--drivers/net/wireless/ath/ath6kl/txrx.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 9dfd7f5..06e4912 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
@@ -470,10 +470,10 @@ enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
stop_adhoc_netq:
/* FIXME: Locking */
- spin_lock(&ar->list_lock);
+ spin_lock_bh(&ar->list_lock);
list_for_each_entry(vif, &ar->vif_list, list) {
if (vif->nw_type == ADHOC_NETWORK) {
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
spin_lock_bh(&vif->if_lock);
set_bit(NETQ_STOPPED, &vif->flags);
@@ -483,7 +483,7 @@ stop_adhoc_netq:
return action;
}
}
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
return action;
}
@@ -637,16 +637,16 @@ void ath6kl_tx_complete(void *context, struct list_head *packet_queue)
__skb_queue_purge(&skb_queue);
/* FIXME: Locking */
- spin_lock(&ar->list_lock);
+ spin_lock_bh(&ar->list_lock);
list_for_each_entry(vif, &ar->vif_list, list) {
if (test_bit(CONNECTED, &vif->flags) &&
!flushing[vif->fw_vif_idx]) {
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
netif_wake_queue(vif->ndev);
- spin_lock(&ar->list_lock);
+ spin_lock_bh(&ar->list_lock);
}
}
- spin_unlock(&ar->list_lock);
+ spin_unlock_bh(&ar->list_lock);
if (wake_event)
wake_up(&ar->event_wq);