aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanohar@qti.qualcomm.com>2016-04-07 02:37:31 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2016-04-07 11:49:55 -0400
commit689de38e37179c6f524dd003e1dae92042f8f5cd (patch)
tree1502cb07919605432b61a6ba33e5e52785a64b05
parentdd7c280f9bf5ee6c7c46f03b2064f9f8fb617183 (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.c8
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))) {