]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
iwlwifi: mvm: synchronize TID queue removal
authorJohannes Berg <johannes.berg@intel.com>
Wed, 4 Jul 2018 21:12:33 +0000 (23:12 +0200)
committerMarcelo Henrique Cerri <marcelo.cerri@canonical.com>
Fri, 17 Jan 2020 17:22:04 +0000 (14:22 -0300)
BugLink: https://bugs.launchpad.net/bugs/1857158
[ Upstream commit 06bc6f6ed4ae0246a5e52094d1be90906a1361c7 ]

When we mark a TID as no longer having a queue, there's no
guarantee the TX path isn't using this txq_id right now,
having accessed it just before we reset the value. To fix
this, add synchronize_net() when we change the TIDs from
having a queue to not having one, so that we can then be
sure that the TX path is no longer accessing that queue.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/net/wireless/intel/iwlwifi/mvm/sta.c

index fda0c8cb7d19c3145f1846d4fc77e78f9d56e69d..adc7d667869dec9e76cafedac6878e482a3e5968 100644 (file)
@@ -438,6 +438,16 @@ static int iwl_mvm_remove_sta_queue_marking(struct iwl_mvm *mvm, int queue)
 
        rcu_read_unlock();
 
+       /*
+        * The TX path may have been using this TXQ_ID from the tid_data,
+        * so make sure it's no longer running so that we can safely reuse
+        * this TXQ later. We've set all the TIDs to IWL_MVM_INVALID_QUEUE
+        * above, but nothing guarantees we've stopped using them. Thus,
+        * without this, we could get to iwl_mvm_disable_txq() and remove
+        * the queue while still sending frames to it.
+        */
+       synchronize_net();
+
        return disable_agg_tids;
 }