diff mbox series

[ath-next] wifi: ath12k: Fix memory leak due to multiple rx_stats allocation

Message ID 20250326213538.2214194-1-muna.sinada@oss.qualcomm.com (mailing list archive)
State Under Review
Delegated to: Jeff Johnson
Headers show
Series [ath-next] wifi: ath12k: Fix memory leak due to multiple rx_stats allocation | expand

Checks

Context Check Description
wifibot/fixes_present success Fixes tag not required for -next series
wifibot/series_format success Single patches do not need cover letters
wifibot/tree_selection success Clearly marked for ath-next
wifibot/ynl success Generated files up to date; no warnings/errors; no diff in generated;
wifibot/build_32bit success Errors and warnings before: 0 this patch: 0
wifibot/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
wifibot/build_clang success Errors and warnings before: 0 this patch: 0
wifibot/build_clang_rust success No Rust files in patch. Skipping build
wifibot/build_tools success No tools touched, skip
wifibot/check_selftest success No net selftest shell script
wifibot/checkpatch success total: 0 errors, 0 warnings, 0 checks, 16 lines checked
wifibot/deprecated_api success None detected
wifibot/header_inline success No static functions without inline keyword in header files
wifibot/kdoc success Errors and warnings before: 0 this patch: 0
wifibot/source_inline success Was 0 now: 0
wifibot/verify_fixes success No Fixes tag
wifibot/verify_signedoff success Signed-off-by tag matches author and committer

Commit Message

Muna Sinada March 26, 2025, 9:35 p.m. UTC
From: Sidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>

rx_stats for each arsta is allocated when adding a station.
arsta->rx_stats will be freed when a station is removed.

Redundant allocations are occurring when the same station is added
multiple times. This causes ath12k_mac_station_add() to be called
multiple times, and rx_stats is allocated each time. As a result there
is memory leaks.

Prevent multiple allocations of rx_stats when ath12k_mac_station_add()
is called repeatedly by checking if rx_stats is already allocated
before allocating again. Allocate arsta->rx_stats if arsta->rx_stats
is NULL respectively.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Sidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>
Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
---
 drivers/net/wireless/ath/ath12k/mac.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)


base-commit: c0dd3f4f70918cbcdd8da611811036a91b7dce33

Comments

Mahendran P April 1, 2025, 4:29 a.m. UTC | #1
On 3/27/2025 3:05 AM, Muna Sinada wrote:
> From: Sidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>
> 
> rx_stats for each arsta is allocated when adding a station.
> arsta->rx_stats will be freed when a station is removed.
> 
> Redundant allocations are occurring when the same station is added
> multiple times. This causes ath12k_mac_station_add() to be called
> multiple times, and rx_stats is allocated each time. As a result there
> is memory leaks.
> 
> Prevent multiple allocations of rx_stats when ath12k_mac_station_add()
> is called repeatedly by checking if rx_stats is already allocated
> before allocating again. Allocate arsta->rx_stats if arsta->rx_stats
> is NULL respectively.
> 
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
> 
> Signed-off-by: Sidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>
> Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
> ---
>  drivers/net/wireless/ath/ath12k/mac.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 842eda56c8b1..f157a85111d9 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -5663,10 +5663,13 @@ static int ath12k_mac_station_add(struct ath12k *ar,
>  			    ar->max_num_stations);
>  		goto exit;
>  	}
> -	arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
> +
>  	if (!arsta->rx_stats) {
> -		ret = -ENOMEM;
> -		goto dec_num_station;
> +		arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
> +		if (!arsta->rx_stats) {
> +			ret = -ENOMEM;
> +			goto dec_num_station;
> +		}
>  	}
>  
>  	peer_param.vdev_id = arvif->vdev_id;
> 
> base-commit: c0dd3f4f70918cbcdd8da611811036a91b7dce33

Reviewed-by: Mahendran P <quic_mahep@quicinc.com>
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 842eda56c8b1..f157a85111d9 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -5663,10 +5663,13 @@  static int ath12k_mac_station_add(struct ath12k *ar,
 			    ar->max_num_stations);
 		goto exit;
 	}
-	arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
+
 	if (!arsta->rx_stats) {
-		ret = -ENOMEM;
-		goto dec_num_station;
+		arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
+		if (!arsta->rx_stats) {
+			ret = -ENOMEM;
+			goto dec_num_station;
+		}
 	}
 
 	peer_param.vdev_id = arvif->vdev_id;