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 |
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 --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;