diff options
author | Johannes Berg <johannes.berg@intel.com> | 2018-07-05 00:12:33 +0300 |
---|---|---|
committer | Luca Coelho <luciano.coelho@intel.com> | 2018-11-11 12:06:14 +0300 |
commit | 06bc6f6ed4ae0246a5e52094d1be90906a1361c7 (patch) | |
tree | 42cbc0e27f25003ec3c244ee2cbb5e9aeed602f5 /drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |
parent | 41c4588b06180aaa46dfc1a7d435befbbf269a93 (diff) | |
download | linux-06bc6f6ed4ae0246a5e52094d1be90906a1361c7.tar.xz |
iwlwifi: mvm: synchronize TID queue removal
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>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/sta.c')
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c index 1887d2b9f185..c2b7bb5d107c 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c @@ -545,6 +545,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; } |