| From f35a7f91f66af528b3ee1921de16bea31d347ab0 Mon Sep 17 00:00:00 2001 |
| From: Rakesh Pillai <pillair@qti.qualcomm.com> |
| Date: Wed, 2 Aug 2017 16:03:37 +0530 |
| Subject: ath10k: fix memory leak in rx ring buffer allocation |
| |
| From: Rakesh Pillai <pillair@qti.qualcomm.com> |
| |
| commit f35a7f91f66af528b3ee1921de16bea31d347ab0 upstream. |
| |
| The rx ring buffers are added to a hash table if |
| firmware support full rx reorder. If the full rx |
| reorder support flag is not set before allocating |
| the rx ring buffers, none of the buffers are added |
| to the hash table. |
| |
| There is a race condition between rx ring refill and |
| rx buffer replenish from napi poll. The interrupts are |
| enabled in hif start, before the rx ring is refilled during init. |
| We replenish buffers from napi poll due to the interrupts which |
| get enabled after hif start. Hence before the entire rx ring is |
| refilled during the init, the napi poll replenishes a few buffers |
| in steps of 100 buffers per attempt. During this rx ring replenish |
| from napi poll, the rx reorder flag has not been set due to which |
| the replenished buffers are not added to the hash table |
| |
| Set the rx full reorder support flag before we allocate |
| the rx ring buffer to avoid the memory leak. |
| |
| Signed-off-by: Rakesh Pillai <pillair@qti.qualcomm.com> |
| Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> |
| Cc: Christian Lamparter <chunkeey@googlemail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/ath/ath10k/core.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/net/wireless/ath/ath10k/core.c |
| +++ b/drivers/net/wireless/ath/ath10k/core.c |
| @@ -1852,6 +1852,12 @@ int ath10k_core_start(struct ath10k *ar, |
| goto err_wmi_detach; |
| } |
| |
| + /* If firmware indicates Full Rx Reorder support it must be used in a |
| + * slightly different manner. Let HTT code know. |
| + */ |
| + ar->htt.rx_ring.in_ord_rx = !!(test_bit(WMI_SERVICE_RX_FULL_REORDER, |
| + ar->wmi.svc_map)); |
| + |
| status = ath10k_htt_rx_alloc(&ar->htt); |
| if (status) { |
| ath10k_err(ar, "failed to alloc htt rx: %d\n", status); |
| @@ -1964,12 +1970,6 @@ int ath10k_core_start(struct ath10k *ar, |
| } |
| } |
| |
| - /* If firmware indicates Full Rx Reorder support it must be used in a |
| - * slightly different manner. Let HTT code know. |
| - */ |
| - ar->htt.rx_ring.in_ord_rx = !!(test_bit(WMI_SERVICE_RX_FULL_REORDER, |
| - ar->wmi.svc_map)); |
| - |
| status = ath10k_htt_rx_ring_refill(ar); |
| if (status) { |
| ath10k_err(ar, "failed to refill htt rx ring: %d\n", status); |