]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: iwlwifi: read txq->read_ptr under lock
authorJohannes Berg <johannes.berg@intel.com>
Tue, 19 Mar 2024 08:10:22 +0000 (10:10 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2024 10:14:38 +0000 (12:14 +0200)
[ Upstream commit c2ace6300600c634553657785dfe5ea0ed688ac2 ]

If we read txq->read_ptr without lock, we can read the same
value twice, then obtain the lock, and reclaim from there
to two different places, but crucially reclaim the same
entry twice, resulting in the WARN_ONCE() a little later.
Fix that by reading txq->read_ptr under lock.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240319100755.bf4c62196504.I978a7ca56c6bd6f1bf42c15aa923ba03366a840b@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/intel/iwlwifi/queue/tx.c

index ca74b1b63cac159cc335feef25edaad6471690c8..0efa304904bd30e3658b80d734c2f807fc737a63 100644 (file)
@@ -1588,9 +1588,9 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
                return;
 
        tfd_num = iwl_txq_get_cmd_index(txq, ssn);
-       read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
 
        spin_lock_bh(&txq->lock);
+       read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
 
        if (!test_bit(txq_id, trans->txqs.queue_used)) {
                IWL_DEBUG_TX_QUEUES(trans, "Q %d inactive - ignoring idx %d\n",