summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin.berg@intel.com>2024-07-03 12:58:56 +0300
committerJohannes Berg <johannes.berg@intel.com>2024-07-04 13:50:05 +0200
commit1a3364e963989dbcd1465dd8e94d9c5babd3474a (patch)
tree1b051405911fc645e6cd3245b7e6c64db2fc98fe /drivers/net/wireless/intel
parent90db50755228252f94b143bbf2380242688b1104 (diff)
downloadlinux-next-1a3364e963989dbcd1465dd8e94d9c5babd3474a.tar.gz
linux-next-1a3364e963989dbcd1465dd8e94d9c5babd3474a.zip
wifi: iwlwifi: keep BHs disabled when TXing from reclaim
During reclaim, we may release the txq->lock spinlock in order to call iwl_trans_tx to queue new frames. The iwl_trans_tx function expects to be called with BHs disabled and iwl_pcie_reclaim is most of the times called with BHs disabled already. However, reclaim can also happen after flushing a STA and in that case BHs will not be disabled. Solve this corner case by only releasing the spinlock but keeping BHs disabled. Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20240703125541.5d12e0e54e9f.Ic53a7ff75f1163eb38bdcf5d66b503e91e6ce5ca@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/tx.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 8afb5fc1972e..1f6db6b90f6f 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -2412,7 +2412,7 @@ void iwl_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
* have tx as well. Bottom line, we can unlock and re-lock
* later.
*/
- spin_unlock_bh(&txq->lock);
+ spin_unlock(&txq->lock);
while ((skb = __skb_dequeue(&overflow_skbs))) {
struct iwl_device_tx_cmd *dev_cmd_ptr;
@@ -2431,7 +2431,7 @@ void iwl_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
if (iwl_txq_space(trans, txq) > txq->low_mark)
iwl_trans_pcie_wake_queue(trans, txq);
- spin_lock_bh(&txq->lock);
+ spin_lock(&txq->lock);
txq->overflow_tx = false;
}