linux/drivers/net/wireless/ath
Rajkumar Manoharan e50525bef5 ath10k: fix deadlock while processing rx_in_ord_ind
commit 5c86d97bcc ("ath10k: combine txrx and replenish task")
introduced deadlock while processing rx in order indication message
for qca6174 based devices. While merging replenish and txrx tasklets,
replenish task should be called out of htt rx ring locking since it
is also try to acquire the same lock.

Unfortunately this issue is not exposed by other solutions (qca988x,
qca99x0 & qca4019), as rx_in_ord_ind message is specific to qca6174
based devices. This patch fixes

=============================================
[ INFO: possible recursive locking detected ]
4.7.0-rc2-wt-ath+ #1353 Tainted: G            E
---------------------------------------------
swapper/3/0 is trying to acquire lock:
 (&(&htt->rx_ring.lock)->rlock){+.-...}, at: [<f8d7ef19>]
ath10k_htt_rx_msdu_buff_replenish+0x29/0x90 [ath10k_core]

but task is already holding lock:
 (&(&htt->rx_ring.lock)->rlock){+.-...}, at: [<f8d82cab>]
ath10k_htt_txrx_compl_task+0x21b/0x250 [ath10k_core]

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&(&htt->rx_ring.lock)->rlock);
  lock(&(&htt->rx_ring.lock)->rlock);

 *** DEADLOCK ***

 May be due to missing lock nesting notation

1 lock held by swapper/3/0:
 #0:  (&(&htt->rx_ring.lock)->rlock){+.-...}, at: [<f8d82cab>]
ath10k_htt_txrx_compl_task+0x21b/0x250 [ath10k_core]

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=119151
Fixes: 5c86d97bcc ("ath10k: combine txrx and replenish task")
Reported-by: Mike Lothian <mike@fireburn.co.uk>
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2016-06-14 15:06:17 +03:00
..
ar5523 cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
ath5k cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
ath6kl ath6kl: add ability to set debug uart baud rate 2016-04-26 14:57:44 +03:00
ath9k wireless-drivers patches for 4.7 2016-05-20 19:40:35 -04:00
ath10k ath10k: fix deadlock while processing rx_in_ord_ind 2016-06-14 15:06:17 +03:00
carl9170 cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
wcn36xx wcn36xx: Set SMD timeout to 10 seconds 2016-04-27 15:02:51 +03:00
wil6210 wil6210: add support for device led configuration 2016-05-11 22:45:20 +03:00
ath.h cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
debug.c ath: Make ath_opmode_to_string understand OCB mode 2015-08-10 22:21:15 +03:00
dfs_pattern_detector.c ath: fix DFS timestamp wraparound reset condition 2015-10-09 11:47:31 +03:00
dfs_pattern_detector.h ath: use PRI value given by spec for fixed PRI 2015-09-27 15:50:30 +03:00
dfs_pri_detector.c ath: use PRI value given by spec for fixed PRI 2015-09-27 15:50:30 +03:00
dfs_pri_detector.h
hw.c
Kconfig ath: unify Kconfig with other vendors 2015-11-18 14:28:31 +02:00
key.c
main.c
Makefile
reg.h
regd_common.h
regd.c cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
regd.h cfg80211: remove enum ieee80211_band 2016-04-12 15:56:15 +02:00
spectral_common.h
trace.c
trace.h