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>
This commit is contained in:

committed by
Kalle Valo

parent
b4b2a0b116
commit
11f6e40d9f
@@ -1046,15 +1046,15 @@ struct ath6kl_vif *ath6kl_vif_first(struct ath6kl *ar)
|
||||
{
|
||||
struct ath6kl_vif *vif;
|
||||
|
||||
spin_lock(&ar->list_lock);
|
||||
spin_lock_bh(&ar->list_lock);
|
||||
if (list_empty(&ar->vif_list)) {
|
||||
spin_unlock(&ar->list_lock);
|
||||
spin_unlock_bh(&ar->list_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vif = list_first_entry(&ar->vif_list, struct ath6kl_vif, list);
|
||||
|
||||
spin_unlock(&ar->list_lock);
|
||||
spin_unlock_bh(&ar->list_lock);
|
||||
|
||||
return vif;
|
||||
}
|
||||
|
Reference in New Issue
Block a user