parent
1b9a39c528
commit
4872c36c55
@ -0,0 +1,65 @@ |
|||||||
|
From: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
|
||||||
|
Date: Mon, 12 Dec 2016 19:50:01 +0100
|
||||||
|
Subject: [PATCH] ath9k: unlock rcu read when returning early
|
||||||
|
|
||||||
|
Starting with ath9k: use ieee80211_tx_status_noskb where possible
|
||||||
|
[d94a461d7a7df68991fb9663531173f60ef89c68] the driver uses rcu_read_lock() &&
|
||||||
|
rcu_read_unlock() yet on returning early in ath_tx_edma_tasklet() the unlock is
|
||||||
|
missing leading to stalls and suspicious RCU usage:
|
||||||
|
|
||||||
|
===============================
|
||||||
|
[ INFO: suspicious RCU usage. ]
|
||||||
|
4.9.0-rc8 #11 Not tainted
|
||||||
|
-------------------------------
|
||||||
|
kernel/rcu/tree.c:705 Illegal idle entry in RCU read-side critical section.!
|
||||||
|
|
||||||
|
other info that might help us debug this:
|
||||||
|
|
||||||
|
RCU used illegally from idle CPU!
|
||||||
|
rcu_scheduler_active = 1, debug_locks = 0
|
||||||
|
RCU used illegally from extended quiescent state!
|
||||||
|
1 lock held by swapper/7/0:
|
||||||
|
#0:
|
||||||
|
(
|
||||||
|
rcu_read_lock
|
||||||
|
){......}
|
||||||
|
, at:
|
||||||
|
[<ffffffffa06ed110>] ath_tx_edma_tasklet+0x0/0x450 [ath9k]
|
||||||
|
|
||||||
|
stack backtrace:
|
||||||
|
CPU: 7 PID: 0 Comm: swapper/7 Not tainted 4.9.0-rc8 #11
|
||||||
|
Hardware name: Acer Aspire V3-571G/VA50_HC_CR, BIOS V2.21 12/16/2013
|
||||||
|
ffff88025efc3f38 ffffffff8132b1e5 ffff88017ede4540 0000000000000001
|
||||||
|
ffff88025efc3f68 ffffffff810a25f7 ffff88025efcee60 ffff88017edebdd8
|
||||||
|
ffff88025eeb5400 0000000000000091 ffff88025efc3f88 ffffffff810c3cd4
|
||||||
|
Call Trace:
|
||||||
|
<IRQ>
|
||||||
|
[<ffffffff8132b1e5>] dump_stack+0x68/0x93
|
||||||
|
[<ffffffff810a25f7>] lockdep_rcu_suspicious+0xd7/0x110
|
||||||
|
[<ffffffff810c3cd4>] rcu_eqs_enter_common.constprop.85+0x154/0x200
|
||||||
|
[<ffffffff810c5a54>] rcu_irq_exit+0x44/0xa0
|
||||||
|
[<ffffffff81058631>] irq_exit+0x61/0xd0
|
||||||
|
[<ffffffff81018d25>] do_IRQ+0x65/0x110
|
||||||
|
[<ffffffff81672189>] common_interrupt+0x89/0x89
|
||||||
|
<EOI>
|
||||||
|
[<ffffffff814ffe11>] ? cpuidle_enter_state+0x151/0x200
|
||||||
|
[<ffffffff814ffee2>] cpuidle_enter+0x12/0x20
|
||||||
|
[<ffffffff8109a6ae>] call_cpuidle+0x1e/0x40
|
||||||
|
[<ffffffff8109a8f6>] cpu_startup_entry+0x146/0x220
|
||||||
|
[<ffffffff810336f8>] start_secondary+0x148/0x170
|
||||||
|
|
||||||
|
Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||||
|
@@ -2757,7 +2757,7 @@ void ath_tx_edma_tasklet(struct ath_soft
|
||||||
|
fifo_list = &txq->txq_fifo[txq->txq_tailidx];
|
||||||
|
if (list_empty(fifo_list)) {
|
||||||
|
ath_txq_unlock(sc, txq);
|
||||||
|
- return;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bf = list_first_entry(fifo_list, struct ath_buf, list);
|
Loading…
Reference in new issue