linux/drivers/net/wireless/ath
Vasanthakumar Thiagarajan a925a37639 ath10k: fix DMA alloc failure for target requested memory chunks
During long hours of stress testing like AP interface up/down along
with continuous ping flood from a station doing connect/disconnect,
it is observed that the system is not able to allocate DMA consistent
memory of size > 512KB chunks as requested by firmware in WMI_SERVICE_EVENTID.
With the system memory getting fragmented during the run based on the
size of the memory requested, the failure to return physically continguous
memory of high order can happen. Once the system gets to this situation,
bringing up the wifi interface will fail and a system reboot may be needed
to make it work again. This problem is obseved with QCA99X0.

To fix this issue, allocate the DMA memory requested by firmware during
device probe time and keep it during the life time of the device. WMI service
ready event handler is changed to allocate the memory chunks if it is
not already allocated or if the memory allocated for the previous ready
event is not same as the current requested ones. After this patch the
memory usage when wifi is inactive will be inceased by few 100KB to
3MB based on the target type.

Failure happens with the following stack trace

[29557.488773] kworker/u4:1: page allocation failure: order:8, mode:0xd0
[29557.494297] CPU: 0 PID: 8402 Comm: kworker/u4:1 Not tainted 3.14.43 #7
[29557.500793] Workqueue: ath10k_aux_wq ath10k_wmi_event_service_ready_work [ath10k_core]
[29557.508602] [<c021e9b0>] (unwind_backtrace) from [<c021ba90>] (show_stack+0x10/0x14)
[29557.516580] [<c021ba90>] (show_stack) from [<c03bdddc>] (dump_stack+0x88/0xcc)
[29557.523612] [<c03bdddc>] (dump_stack) from [<c0290e34>] (warn_alloc_failed+0xdc/0x108)
[29557.531515] [<c0290e34>] (warn_alloc_failed) from [<c0292d88>] (__alloc_pages_nodemask+0x4f0/0x654)
[29557.540485] [<c0292d88>] (__alloc_pages_nodemask) from [<c0222b48>] (__dma_alloc_buffer.isra.20+0x2c/0x104)
[29557.550260] [<c0222b48>] (__dma_alloc_buffer.isra.20) from [<c0222c34>] (__alloc_remap_buffer.isra.23+0x14/0xb8)
[29557.560413] [<c0222c34>] (__alloc_remap_buffer.isra.23) from [<c022305c>] (__dma_alloc+0x224/0x2b8)
[29557.569490] [<c022305c>] (__dma_alloc) from [<c0223208>] (arm_dma_alloc+0x84/0x90)
[29557.577010] [<c0223208>] (arm_dma_alloc) from [<bf5159d0>] (ath10k_wmi_event_service_ready_work+0x2f8/0x420 [ath10k_core])
[29557.588055] [<bf5159d0>] (ath10k_wmi_event_service_ready_work [ath10k_core]) from [<c024260c>] (process_one_work+0x20c/0x328)
[29557.599305] [<c024260c>] (process_one_work) from [<c02432d0>] (worker_thread+0x228/0x360)
[29557.607470] [<c02432d0>] (worker_thread) from [<c0247f88>] (kthread+0xd8/0xec)
[29557.614750] [<c0247f88>] (kthread) from [<c0208d18>] (ret_from_fork+0x14/0x3c)
[29557.712751] Normal: 696*4kB (UEMR) 512*8kB (UEMR) 367*16kB (UEMR) 404*32kB (UEMR) 455*64kB (UEMR) 424*128kB (UEMR) 379*256kB (UMR) 327*512kB (UMR) 1*1024kB (R) 0*2048kB 0*4096kB = 374544kB

Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2015-09-09 12:34:42 +03:00
..
ar5523 mac80211: convert HW flags to unsigned long bitmap 2015-06-10 16:05:36 +02:00
ath5k mac80211: convert HW flags to unsigned long bitmap 2015-06-10 16:05:36 +02:00
ath6kl ath6kl: spell "distribution" correctly in a comment. 2015-07-29 11:14:04 +03:00
ath9k ath9k: match wait_for_completion_timeout return type 2015-08-13 15:27:12 +03:00
ath10k ath10k: fix DMA alloc failure for target requested memory chunks 2015-09-09 12:34:42 +03:00
carl9170 mac80211: convert HW flags to unsigned long bitmap 2015-06-10 16:05:36 +02:00
wcn36xx mac80211: convert HW flags to unsigned long bitmap 2015-06-10 16:05:36 +02:00
wil6210 wil6210: match wait_for_completion_timeout return type 2015-08-17 17:38:55 +03:00
ath.h ath9k: Add a new debug flag for FFT spectral scan 2015-05-09 16:46:08 +03:00
debug.c ath: Make ath_opmode_to_string understand OCB mode 2015-08-10 22:21:15 +03:00
dfs_pattern_detector.c Merge ath-next from ath.git 2015-04-28 14:44:19 +03:00
dfs_pattern_detector.h ath: introduce chirp parameter used by DFS 2015-03-05 15:55:16 +02:00
dfs_pri_detector.c ath: DFS - limit number of potential PRI sequences 2015-06-30 15:33:32 +03:00
dfs_pri_detector.h
hw.c
Kconfig
key.c
main.c
Makefile
reg.h
regd_common.h
regd.c
regd.h
spectral_common.h
trace.c
trace.h