]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: add the missing RCU lock in ath12k_dp_tx_free_txbuf()
authorBaochen Qiang <baochen.qiang@oss.qualcomm.com>
Wed, 19 Nov 2025 02:15:57 +0000 (10:15 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Wed, 19 Nov 2025 19:52:08 +0000 (11:52 -0800)
RCU read lock is missing in ath12k_dp_tx_free_txbuf() before calling
ath12k_dp_to_pdev_dp(), causing below warning:

WARNING: suspicious RCU usage
-----------------------------
drivers/net/wireless/ath/ath12k/dp.h:653 ath12k dp to dp pdev called without rcu lock!
Call Trace:
 <IRQ>
 show_stack
 dump_stack_lvl
 dump_stack
 lockdep_rcu_suspicious.cold
 ath12k_dp_tx_free_txbuf
 ath12k_wifi7_dp_tx_completion_handler
 ath12k_wifi7_dp_service_srng
 ath12k_pci_ext_grp_napi_poll
 [...]
 </IRQ>

Invoke guard(rcu) to fix it.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00302-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.115823.3

Signed-off-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20251119-ath12k-fix-missing-rcu-lock-v1-1-8155de1dc4fc@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_tx.c

index 1d4444f3936ffb63ad6022fa502a2578895ccef5..c10da6195c9c3407e22cbfd8aecfbf823fe1ea9e 100644 (file)
@@ -194,8 +194,6 @@ void ath12k_dp_tx_free_txbuf(struct ath12k_dp *dp,
 
        skb_cb = ATH12K_SKB_CB(msdu);
 
-       dp_pdev = ath12k_dp_to_pdev_dp(dp, pdev_idx);
-
        dma_unmap_single(dp->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
        if (skb_cb->paddr_ext_desc) {
                dma_unmap_single(dp->dev, skb_cb->paddr_ext_desc,
@@ -203,6 +201,10 @@ void ath12k_dp_tx_free_txbuf(struct ath12k_dp *dp,
                dev_kfree_skb_any(desc_params->skb_ext_desc);
        }
 
+       guard(rcu)();
+
+       dp_pdev = ath12k_dp_to_pdev_dp(dp, pdev_idx);
+
        ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
 
        if (atomic_dec_and_test(&dp_pdev->num_tx_pending))