mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-14 11:13:29 +00:00
59 lines
2.2 KiB
Diff
59 lines
2.2 KiB
Diff
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
|
|
|
|
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>
|
|
---
|
|
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
|
|
@@ -1957,6 +1957,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);
|
|
@@ -2065,12 +2071,6 @@ int ath10k_core_start(struct ath10k *ar,
|
|
goto err_hif_stop;
|
|
}
|
|
|
|
- /* 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);
|