diff options
author | Rajkumar Manoharan <rmanohar@qti.qualcomm.com> | 2016-04-07 02:37:31 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2016-04-07 11:49:55 -0400 |
commit | 689de38e37179c6f524dd003e1dae92042f8f5cd (patch) | |
tree | 1502cb07919605432b61a6ba33e5e52785a64b05 | |
parent | dd7c280f9bf5ee6c7c46f03b2064f9f8fb617183 (diff) |
ath10k: fix unconditional num_mpdus_ready subtraction
Decrement num_mpdus_ready only when rx amsdu is processed successfully.
Not doing so, will result in leak and impact stabilty under low memory
cases. Also commit 3128b3d8a2b9 ("ath10k: speedup htt rx descriptor
processing for rx_ind") missed to removed unused skb list rx_q.
Fixes: 3128b3d8a2b9 ("ath10k: speedup htt rx descriptor processing for rx_ind")
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r-- | drivers/net/wireless/ath/ath10k/htt_rx.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index 592421ec5635..6a2d2643de42 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | |||
@@ -2412,14 +2412,12 @@ static void ath10k_htt_txrx_compl_task(unsigned long ptr) | |||
2412 | struct ath10k_htt *htt = (struct ath10k_htt *)ptr; | 2412 | struct ath10k_htt *htt = (struct ath10k_htt *)ptr; |
2413 | struct ath10k *ar = htt->ar; | 2413 | struct ath10k *ar = htt->ar; |
2414 | struct htt_tx_done tx_done = {}; | 2414 | struct htt_tx_done tx_done = {}; |
2415 | struct sk_buff_head rx_q; | ||
2416 | struct sk_buff_head rx_ind_q; | 2415 | struct sk_buff_head rx_ind_q; |
2417 | struct sk_buff_head tx_ind_q; | 2416 | struct sk_buff_head tx_ind_q; |
2418 | struct sk_buff *skb; | 2417 | struct sk_buff *skb; |
2419 | unsigned long flags; | 2418 | unsigned long flags; |
2420 | int num_mpdus; | 2419 | int num_mpdus; |
2421 | 2420 | ||
2422 | __skb_queue_head_init(&rx_q); | ||
2423 | __skb_queue_head_init(&rx_ind_q); | 2421 | __skb_queue_head_init(&rx_ind_q); |
2424 | __skb_queue_head_init(&tx_ind_q); | 2422 | __skb_queue_head_init(&tx_ind_q); |
2425 | 2423 | ||
@@ -2447,11 +2445,13 @@ static void ath10k_htt_txrx_compl_task(unsigned long ptr) | |||
2447 | ath10k_mac_tx_push_pending(ar); | 2445 | ath10k_mac_tx_push_pending(ar); |
2448 | 2446 | ||
2449 | num_mpdus = atomic_read(&htt->num_mpdus_ready); | 2447 | num_mpdus = atomic_read(&htt->num_mpdus_ready); |
2450 | atomic_sub(num_mpdus, &htt->num_mpdus_ready); | ||
2451 | 2448 | ||
2452 | while (num_mpdus--) { | 2449 | while (num_mpdus) { |
2453 | if (ath10k_htt_rx_handle_amsdu(htt)) | 2450 | if (ath10k_htt_rx_handle_amsdu(htt)) |
2454 | break; | 2451 | break; |
2452 | |||
2453 | num_mpdus--; | ||
2454 | atomic_dec(&htt->num_mpdus_ready); | ||
2455 | } | 2455 | } |
2456 | 2456 | ||
2457 | while ((skb = __skb_dequeue(&rx_ind_q))) { | 2457 | while ((skb = __skb_dequeue(&rx_ind_q))) { |