wifi: ath12k: fix a possible dead lock caused by ab->base_lock
authorBaochen Qiang <quic_bqiang@quicinc.com>
Fri, 18 Apr 2025 02:55:34 +0000 (10:55 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 16 May 2025 19:38:52 +0000 (12:38 -0700)
spin_lock/spin_unlock are used in ath12k_reg_chan_list_event
to acquire/release ab->base_lock. For now this is safe because
that function is only called in soft IRQ context.

But ath12k_reg_chan_list_event() will be called from process
context in an upcoming patch, and this can result in a deadlock
if ab->base_lock is acquired in process context and then soft
IRQ occurs on the same CPU and tries to acquire that lock.

Fix it by using spin_lock_bh and spin_unlock_bh instead.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250418-ath12k-6g-lp-vlp-v1-1-c869c86cad60@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/wmi.c

index ea303dca38b51f98399079cd3ac06a48fd9cc025..256e05e28afdbee8267bd2ab25bb47cba4530e96 100644 (file)
@@ -6194,7 +6194,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk
                goto fallback;
        }
 
-       spin_lock(&ab->base_lock);
+       spin_lock_bh(&ab->base_lock);
        if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) {
                /* Once mac is registered, ar is valid and all CC events from
                 * fw is considered to be received due to user requests
@@ -6218,7 +6218,7 @@ static int ath12k_reg_chan_list_event(struct ath12k_base *ab, struct sk_buff *sk
                ab->default_regd[pdev_idx] = regd;
        }
        ab->dfs_region = reg_info->dfs_region;
-       spin_unlock(&ab->base_lock);
+       spin_unlock_bh(&ab->base_lock);
 
        goto mem_free;