From 4872c36c55f9423ac3a5859fd4eb42a23545632b Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 13 Dec 2016 12:32:13 +0100 Subject: [PATCH] ath9k: add a RCU related bugfix Signed-off-by: Felix Fietkau --- ...unlock-rcu-read-when-returning-early.patch | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 package/kernel/mac80211/patches/329-ath9k-unlock-rcu-read-when-returning-early.patch diff --git a/package/kernel/mac80211/patches/329-ath9k-unlock-rcu-read-when-returning-early.patch b/package/kernel/mac80211/patches/329-ath9k-unlock-rcu-read-when-returning-early.patch new file mode 100644 index 0000000000..b8ba355899 --- /dev/null +++ b/package/kernel/mac80211/patches/329-ath9k-unlock-rcu-read-when-returning-early.patch @@ -0,0 +1,65 @@ +From: Tobias Klausmann +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: + [] 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: + + [] dump_stack+0x68/0x93 + [] lockdep_rcu_suspicious+0xd7/0x110 + [] rcu_eqs_enter_common.constprop.85+0x154/0x200 + [] rcu_irq_exit+0x44/0xa0 + [] irq_exit+0x61/0xd0 + [] do_IRQ+0x65/0x110 + [] common_interrupt+0x89/0x89 + + [] ? cpuidle_enter_state+0x151/0x200 + [] cpuidle_enter+0x12/0x20 + [] call_cpuidle+0x1e/0x40 + [] cpu_startup_entry+0x146/0x220 + [] start_secondary+0x148/0x170 + +Signed-off-by: Tobias Klausmann +Signed-off-by: Felix Fietkau +--- + +--- 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); -- 2.30.2