]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath11k: fix sleeping-in-atomic in ath11k_mac_op_set_bitrate_mask()
authorBaochen Qiang <quic_bqiang@quicinc.com>
Tue, 3 Jun 2025 02:25:28 +0000 (10:25 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Aug 2025 14:38:48 +0000 (16:38 +0200)
[ Upstream commit 65c12b104cb942d588a1a093acc4537fb3d3b129 ]

ath11k_mac_disable_peer_fixed_rate() is passed as the iterator to
ieee80211_iterate_stations_atomic(). Note in this case the iterator is
required to be atomic, however ath11k_mac_disable_peer_fixed_rate() does
not follow it as it might sleep. Consequently below warning is seen:

BUG: sleeping function called from invalid context at wmi.c:304
Call Trace:
 <TASK>
 dump_stack_lvl
 __might_resched.cold
 ath11k_wmi_cmd_send
 ath11k_wmi_set_peer_param
 ath11k_mac_disable_peer_fixed_rate
 ieee80211_iterate_stations_atomic
 ath11k_mac_op_set_bitrate_mask.cold

Change to ieee80211_iterate_stations_mtx() to fix this issue.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30

Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Link: https://patch.msgid.link/20250603-ath11k-use-non-atomic-iterator-v1-1-d75762068d56@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath11k/mac.c

index 13301ca317a532b86cc6003d33306672307ea193..977f370fd6de42812867e71f08aebaac722d0640 100644 (file)
@@ -8740,9 +8740,9 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                                    arvif->vdev_id, ret);
                        return ret;
                }
-               ieee80211_iterate_stations_atomic(ar->hw,
-                                                 ath11k_mac_disable_peer_fixed_rate,
-                                                 arvif);
+               ieee80211_iterate_stations_mtx(ar->hw,
+                                              ath11k_mac_disable_peer_fixed_rate,
+                                              arvif);
        } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
                                                          &single_nss)) {
                rate = WMI_FIXED_RATE_NONE;
@@ -8809,9 +8809,9 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                }
 
                mutex_lock(&ar->conf_mutex);
-               ieee80211_iterate_stations_atomic(ar->hw,
-                                                 ath11k_mac_disable_peer_fixed_rate,
-                                                 arvif);
+               ieee80211_iterate_stations_mtx(ar->hw,
+                                              ath11k_mac_disable_peer_fixed_rate,
+                                              arvif);
 
                arvif->bitrate_mask = *mask;
                ieee80211_iterate_stations_atomic(ar->hw,