Message ID | 1501670017-12862-1-git-send-email-pillair@codeaurora.org (mailing list archive) |
---|---|
State | Accepted |
Commit | f35a7f91f66af528b3ee1921de16bea31d347ab0 |
Delegated to: | Kalle Valo |
Headers | show |
Rakesh Pillai <pillair@codeaurora.org> wrote: > 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> Patch applied to ath-next branch of ath.git, thanks. f35a7f91f66a ath10k: fix memory leak in rx ring buffer allocation
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 6906bdd..10b3384 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -1886,6 +1886,12 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode, 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); @@ -1997,12 +2003,6 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode, } } - /* 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);