diff mbox series

wifi: ath11k: fix memory leak in WMI firmware stats

Message ID 20230606091128.14202-1-quic_adisi@quicinc.com
State New
Headers show
Series wifi: ath11k: fix memory leak in WMI firmware stats | expand

Commit Message

Aditya Kumar Singh June 6, 2023, 9:11 a.m. UTC
From: P Praneesh <quic_ppranees@quicinc.com>

Memory allocated for firmware pdev, vdev and beacon statistics
are not released during rmmod.

Fix it by calling ath11k_fw_stats_free() function before hardware
unregister.

While at it, avoid calling ath11k_fw_stats_free() while processing
the firmware stats received in the WMI event because the local list
is getting spliced and reinitialised and hence there are no elements
in the list after splicing.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1

Signed-off-by: P Praneesh <quic_ppranees@quicinc.com>
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
---
 drivers/net/wireless/ath/ath11k/mac.c | 1 +
 drivers/net/wireless/ath/ath11k/wmi.c | 5 +++++
 2 files changed, 6 insertions(+)


base-commit: a4756ac34a7002861c9bdf8cf45aec53a77fb78d

Comments

Kalle Valo June 13, 2023, 9:15 a.m. UTC | #1
Aditya Kumar Singh <quic_adisi@quicinc.com> wrote:

> Memory allocated for firmware pdev, vdev and beacon statistics
> are not released during rmmod.
> 
> Fix it by calling ath11k_fw_stats_free() function before hardware
> unregister.
> 
> While at it, avoid calling ath11k_fw_stats_free() while processing
> the firmware stats received in the WMI event because the local list
> is getting spliced and reinitialised and hence there are no elements
> in the list after splicing.
> 
> Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
> 
> Signed-off-by: P Praneesh <quic_ppranees@quicinc.com>
> Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>

Patch applied to ath-next branch of ath.git, thanks.

6aafa1c2d3e3 wifi: ath11k: fix memory leak in WMI firmware stats
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index a31b8e89684b..2e462e7a8b4d 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -9792,6 +9792,7 @@  void ath11k_mac_destroy(struct ath11k_base *ab)
 		if (!ar)
 			continue;
 
+		ath11k_fw_stats_free(&ar->fw_stats);
 		ieee80211_free_hw(ar->hw);
 		pdev->ar = NULL;
 	}
diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c
index 68622a850527..8b457558b975 100644
--- a/drivers/net/wireless/ath/ath11k/wmi.c
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
@@ -8097,6 +8097,11 @@  static void ath11k_update_stats_event(struct ath11k_base *ab, struct sk_buff *sk
 	rcu_read_unlock();
 	spin_unlock_bh(&ar->data_lock);
 
+	/* Since the stats's pdev, vdev and beacon list are spliced and reinitialised
+	 * at this point, no need to free the individual list.
+	 */
+	return;
+
 free:
 	ath11k_fw_stats_free(&stats);
 }