stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: P Praneesh <quic_ppranees@quicinc.com>,
	Jeff Johnson <jeff.johnson@oss.qualcomm.com>,
	Sasha Levin <sashal@kernel.org>,
	jjohnson@kernel.org, ath12k@lists.infradead.org
Subject: [PATCH AUTOSEL 6.14 06/54] wifi: ath12k: Avoid memory leak while enabling statistics
Date: Thu,  3 Apr 2025 15:01:21 -0400	[thread overview]
Message-ID: <20250403190209.2675485-6-sashal@kernel.org> (raw)
In-Reply-To: <20250403190209.2675485-1-sashal@kernel.org>

From: P Praneesh <quic_ppranees@quicinc.com>

[ Upstream commit ecfc131389923405be8e7a6f4408fd9321e4d19b ]

Driver uses monitor destination rings for extended statistics mode and
standalone monitor mode. In extended statistics mode, TLVs are parsed from
the buffer received from the monitor destination ring and assigned to the
ppdu_info structure to update per-packet statistics. In standalone monitor
mode, along with per-packet statistics, the packet data (payload) is
captured, and the driver updates per MSDU to mac80211.

When the AP interface is enabled, only extended statistics mode is
activated. As part of enabling monitor rings for collecting statistics,
the driver subscribes to HAL_RX_MPDU_START TLV in the filter
configuration. This TLV is received from the monitor destination ring, and
kzalloc for the mon_mpdu object occurs, which is not freed, leading to a
memory leak. The kzalloc for the mon_mpdu object is only required while
enabling the standalone monitor interface. This causes a memory leak while
enabling extended statistics mode in the driver.

Fix this memory leak by removing the kzalloc for the mon_mpdu object in
the HAL_RX_MPDU_START TLV handling. Additionally, remove the standalone
monitor mode handlings in the HAL_MON_BUF_ADDR and HAL_RX_MSDU_END TLVs.
These TLV tags will be handled properly when enabling standalone monitor
mode in the future.

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: P Praneesh <quic_ppranees@quicinc.com>
Link: https://patch.msgid.link/20241223060132.3506372-13-quic_ppranees@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/net/wireless/ath/ath12k/dp_mon.c | 64 ++++--------------------
 drivers/net/wireless/ath/ath12k/hal_rx.h |  3 ++
 2 files changed, 12 insertions(+), 55 deletions(-)

diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
index 252d8e8a2080e..0b089389087d3 100644
--- a/drivers/net/wireless/ath/ath12k/dp_mon.c
+++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
@@ -743,7 +743,6 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
 	}
 	case HAL_RX_MPDU_START: {
 		const struct hal_rx_mpdu_start *mpdu_start = tlv_data;
-		struct dp_mon_mpdu *mon_mpdu = pmon->mon_mpdu;
 		u16 peer_id;
 
 		info[1] = __le32_to_cpu(mpdu_start->info1);
@@ -760,65 +759,17 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
 				u32_get_bits(info[0], HAL_RX_MPDU_START_INFO1_PEERID);
 		}
 
-		mon_mpdu = kzalloc(sizeof(*mon_mpdu), GFP_ATOMIC);
-		if (!mon_mpdu)
-			return HAL_RX_MON_STATUS_PPDU_NOT_DONE;
-
 		break;
 	}
 	case HAL_RX_MSDU_START:
 		/* TODO: add msdu start parsing logic */
 		break;
-	case HAL_MON_BUF_ADDR: {
-		struct dp_rxdma_mon_ring *buf_ring = &ab->dp.rxdma_mon_buf_ring;
-		const struct dp_mon_packet_info *packet_info = tlv_data;
-		int buf_id = u32_get_bits(packet_info->cookie,
-					  DP_RXDMA_BUF_COOKIE_BUF_ID);
-		struct sk_buff *msdu;
-		struct dp_mon_mpdu *mon_mpdu = pmon->mon_mpdu;
-		struct ath12k_skb_rxcb *rxcb;
-
-		spin_lock_bh(&buf_ring->idr_lock);
-		msdu = idr_remove(&buf_ring->bufs_idr, buf_id);
-		spin_unlock_bh(&buf_ring->idr_lock);
-
-		if (unlikely(!msdu)) {
-			ath12k_warn(ab, "monitor destination with invalid buf_id %d\n",
-				    buf_id);
-			return HAL_RX_MON_STATUS_PPDU_NOT_DONE;
-		}
-
-		rxcb = ATH12K_SKB_RXCB(msdu);
-		dma_unmap_single(ab->dev, rxcb->paddr,
-				 msdu->len + skb_tailroom(msdu),
-				 DMA_FROM_DEVICE);
-
-		if (mon_mpdu->tail)
-			mon_mpdu->tail->next = msdu;
-		else
-			mon_mpdu->tail = msdu;
-
-		ath12k_dp_mon_buf_replenish(ab, buf_ring, 1);
-
-		break;
-	}
-	case HAL_RX_MSDU_END: {
-		const struct rx_msdu_end_qcn9274 *msdu_end = tlv_data;
-		bool is_first_msdu_in_mpdu;
-		u16 msdu_end_info;
-
-		msdu_end_info = __le16_to_cpu(msdu_end->info5);
-		is_first_msdu_in_mpdu = u32_get_bits(msdu_end_info,
-						     RX_MSDU_END_INFO5_FIRST_MSDU);
-		if (is_first_msdu_in_mpdu) {
-			pmon->mon_mpdu->head = pmon->mon_mpdu->tail;
-			pmon->mon_mpdu->tail = NULL;
-		}
-		break;
-	}
+	case HAL_MON_BUF_ADDR:
+		return HAL_RX_MON_STATUS_BUF_ADDR;
+	case HAL_RX_MSDU_END:
+		return HAL_RX_MON_STATUS_MSDU_END;
 	case HAL_RX_MPDU_END:
-		list_add_tail(&pmon->mon_mpdu->list, &pmon->dp_rx_mon_mpdu_list);
-		break;
+		return HAL_RX_MON_STATUS_MPDU_END;
 	case HAL_DUMMY:
 		return HAL_RX_MON_STATUS_BUF_DONE;
 	case HAL_RX_PPDU_END_STATUS_DONE:
@@ -1216,7 +1167,10 @@ ath12k_dp_mon_parse_rx_dest(struct ath12k_base *ab, struct ath12k_mon_data *pmon
 		if ((ptr - skb->data) >= DP_RX_BUFFER_SIZE)
 			break;
 
-	} while (hal_status == HAL_RX_MON_STATUS_PPDU_NOT_DONE);
+	} while ((hal_status == HAL_RX_MON_STATUS_PPDU_NOT_DONE) ||
+		 (hal_status == HAL_RX_MON_STATUS_BUF_ADDR) ||
+		 (hal_status == HAL_RX_MON_STATUS_MPDU_END) ||
+		 (hal_status == HAL_RX_MON_STATUS_MSDU_END));
 
 	return hal_status;
 }
diff --git a/drivers/net/wireless/ath/ath12k/hal_rx.h b/drivers/net/wireless/ath/ath12k/hal_rx.h
index b08aa2e79f411..54f3eaeca8bb9 100644
--- a/drivers/net/wireless/ath/ath12k/hal_rx.h
+++ b/drivers/net/wireless/ath/ath12k/hal_rx.h
@@ -108,6 +108,9 @@ enum hal_rx_mon_status {
 	HAL_RX_MON_STATUS_PPDU_NOT_DONE,
 	HAL_RX_MON_STATUS_PPDU_DONE,
 	HAL_RX_MON_STATUS_BUF_DONE,
+	HAL_RX_MON_STATUS_BUF_ADDR,
+	HAL_RX_MON_STATUS_MPDU_END,
+	HAL_RX_MON_STATUS_MSDU_END,
 };
 
 #define HAL_RX_MAX_MPDU		256
-- 
2.39.5


  parent reply	other threads:[~2025-04-03 19:02 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-03 19:01 [PATCH AUTOSEL 6.14 01/54] wifi: ath9k: use unsigned long for activity check timestamp Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 02/54] wifi: ath11k: Fix DMA buffer allocation to resolve SWIOTLB issues Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 03/54] wifi: ath11k: fix memory leak in ath11k_xxx_remove() Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 04/54] wifi: ath12k: fix memory leak in ath12k_pci_remove() Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 05/54] wifi: ath12k: Fix invalid entry fetch in ath12k_dp_mon_srng_process Sasha Levin
2025-04-03 19:01 ` Sasha Levin [this message]
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 07/54] ata: libata-core: Add 'external' to the libata.force kernel parameter Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 08/54] scsi: mpi3mr: Avoid reply queue full condition Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 09/54] scsi: mpi3mr: Synchronous access b/w reset and tm thread for reply queue Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 10/54] net: page_pool: don't cast mp param to devmem Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 11/54] f2fs: don't retry IO for corrupted data scenario Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 12/54] wifi: mac80211: add strict mode disabling workarounds Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 13/54] wifi: mac80211: ensure sdata->work is canceled before initialized Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 14/54] scsi: target: spc: Fix RSOC parameter data header size Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 15/54] net: usb: asix_devices: add FiberGecko DeviceID Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 16/54] page_pool: avoid infinite loop to schedule delayed worker Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 17/54] can: flexcan: Add quirk to handle separate interrupt lines for mailboxes Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 18/54] can: flexcan: add NXP S32G2/S32G3 SoC support Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 19/54] jfs: Fix uninit-value access of imap allocated in the diMount() function Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 20/54] mptcp: move the whole rx path under msk socket lock protection Sasha Levin
2025-04-10 11:05   ` Matthieu Baerts
2025-04-14  0:12     ` Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 21/54] fs/jfs: cast inactags to s64 to prevent potential overflow Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 22/54] fs/jfs: Prevent integer overflow in AG size calculation Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 23/54] jfs: Prevent copying of nlink with value 0 from disk inode Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 24/54] jfs: add sanity check for agwidth in dbMount Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 25/54] wifi: rtw88: Add support for Mercusys MA30N and D-Link DWA-T185 rev. A1 Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 26/54] ata: libata-eh: Do not use ATAPI DMA for a device limited to PIO mode Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 27/54] net: sfp: add quirk for 2.5G OEM BX SFP Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 28/54] wifi: ath12k: Fix invalid data access in ath12k_dp_rx_h_undecap_nwifi Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 29/54] null_blk: replace null_process_cmd() call in null_zone_write() Sasha Levin
2025-04-04  3:31   ` Shinichiro Kawasaki
2025-04-14  0:12     ` Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 30/54] f2fs: fix to avoid out-of-bounds access in f2fs_truncate_inode_blocks() Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 31/54] net: sfp: add quirk for FS SFP-10GM-T copper SFP+ module Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 32/54] ahci: add PCI ID for Marvell 88SE9215 SATA Controller Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 33/54] ext4: protect ext4_release_dquot against freezing Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 34/54] Revert "f2fs: rebuild nat_bits during umount" Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 35/54] wifi: mac80211: fix userspace_selectors corruption Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 36/54] ext4: ignore xattrs past end Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 37/54] cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 38/54] scsi: st: Fix array overflow in st_setup() Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 39/54] ahci: Marvell 88SE9215 controllers prefer DMA for ATAPI Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 40/54] btrfs: reject out-of-band dirty folios during writeback Sasha Levin
2025-04-03 19:37   ` David Sterba
2025-04-14  0:11     ` Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 41/54] btrfs: harden block_group::bg_list against list_del() races Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 42/54] wifi: mt76: mt76x2u: add TP-Link TL-WDN6200 ID to device table Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 43/54] net: vlan: don't propagate flags on open Sasha Levin
2025-04-03 19:01 ` [PATCH AUTOSEL 6.14 44/54] tracing: fix return value in __ftrace_event_enable_disable for TRACE_REG_UNREGISTER Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 45/54] Bluetooth: btusb: Add new VID/PID for WCN785x Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 46/54] Bluetooth: btintel_pcie: Add device id of Whale Peak Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 47/54] Bluetooth: btusb: Add 13 USB device IDs for Qualcomm WCN785x Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 48/54] Bluetooth: hci_uart: fix race during initialization Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 49/54] Bluetooth: btusb: Add 2 HWIDs for MT7922 Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 50/54] Bluetooth: hci_qca: use the power sequencer for wcn6750 Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 51/54] Bluetooth: qca: simplify WCN399x NVM loading Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 52/54] Bluetooth: qca: add WCN3950 support Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 53/54] Bluetooth: Add quirk for broken READ_VOICE_SETTING Sasha Levin
2025-04-03 19:02 ` [PATCH AUTOSEL 6.14 54/54] Bluetooth: Add quirk for broken READ_PAGE_SCAN_TYPE Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250403190209.2675485-6-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=ath12k@lists.infradead.org \
    --cc=jeff.johnson@oss.qualcomm.com \
    --cc=jjohnson@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=quic_ppranees@quicinc.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).