Skip to content

Commit eff8182

Browse files
Manikanta Pubbisettygregkh
authored andcommitted
wifi: ath10k: Fix memory leak in management tx
commit e15d84b upstream. In the current logic, memory is allocated for storing the MSDU context during management packet TX but this memory is not being freed during management TX completion. Similar leaks are seen in the management TX cleanup logic. Kmemleak reports this problem as below, unreferenced object 0xffffff80b64ed250 (size 16): comm "kworker/u16:7", pid 148, jiffies 4294687130 (age 714.199s) hex dump (first 16 bytes): 00 2b d8 d8 80 ff ff ff c4 74 e9 fd 07 00 00 00 .+.......t...... backtrace: [<ffffffe6e7b245dc>] __kmem_cache_alloc_node+0x1e4/0x2d8 [<ffffffe6e7adde88>] kmalloc_trace+0x48/0x110 [<ffffffe6bbd765fc>] ath10k_wmi_tlv_op_gen_mgmt_tx_send+0xd4/0x1d8 [ath10k_core] [<ffffffe6bbd3eed4>] ath10k_mgmt_over_wmi_tx_work+0x134/0x298 [ath10k_core] [<ffffffe6e78d5974>] process_scheduled_works+0x1ac/0x400 [<ffffffe6e78d60b8>] worker_thread+0x208/0x328 [<ffffffe6e78dc890>] kthread+0x100/0x1c0 [<ffffffe6e78166c0>] ret_from_fork+0x10/0x20 Free the memory during completion and cleanup to fix the leak. Protect the mgmt_pending_tx idr_remove() operation in ath10k_wmi_tlv_op_cleanup_mgmt_tx_send() using ar->data_lock similar to other instances. Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.2.0-01387-QCAHLSWMTPLZ-1 Fixes: dc40515 ("ath10k: handle mgmt tx completion event") Fixes: c730c47 ("ath10k: Remove msdu from idr when management pkt send fails") Cc: [email protected] Signed-off-by: Manikanta Pubbisetty <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jeff Johnson <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b0b862a commit eff8182

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

drivers/net/wireless/ath/ath10k/wmi-tlv.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2655,9 +2655,14 @@ ath10k_wmi_tlv_op_cleanup_mgmt_tx_send(struct ath10k *ar,
26552655
struct sk_buff *msdu)
26562656
{
26572657
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
2658+
struct ath10k_mgmt_tx_pkt_addr *pkt_addr;
26582659
struct ath10k_wmi *wmi = &ar->wmi;
26592660

2660-
idr_remove(&wmi->mgmt_pending_tx, cb->msdu_id);
2661+
spin_lock_bh(&ar->data_lock);
2662+
pkt_addr = idr_remove(&wmi->mgmt_pending_tx, cb->msdu_id);
2663+
spin_unlock_bh(&ar->data_lock);
2664+
2665+
kfree(pkt_addr);
26612666

26622667
return 0;
26632668
}

drivers/net/wireless/ath/ath10k/wmi.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,6 +2362,7 @@ static int wmi_process_mgmt_tx_comp(struct ath10k *ar, u32 desc_id,
23622362
dma_unmap_single(ar->dev, pkt_addr->paddr,
23632363
msdu->len, DMA_TO_DEVICE);
23642364
info = IEEE80211_SKB_CB(msdu);
2365+
kfree(pkt_addr);
23652366

23662367
if (status)
23672368
info->flags &= ~IEEE80211_TX_STAT_ACK;
@@ -9233,6 +9234,7 @@ static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,
92339234
dma_unmap_single(ar->dev, pkt_addr->paddr,
92349235
msdu->len, DMA_TO_DEVICE);
92359236
ieee80211_free_txskb(ar->hw, msdu);
9237+
kfree(pkt_addr);
92369238

92379239
return 0;
92389240
}

0 commit comments

Comments
 (0)