mac80211: mark TX-during-stop for TX in in_reconfig
authorJohannes Berg <johannes.berg@intel.com>
Mon, 29 Nov 2021 13:32:39 +0000 (15:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Dec 2021 08:30:50 +0000 (09:30 +0100)
commit db7205af049d230e7e0abf61c1e74c1aab40f390 upstream.

Mark TXQs as having seen transmit while they were stopped if
we bail out of drv_wake_tx_queue() due to reconfig, so that
the queue wake after this will make them catch up. This is
particularly necessary for when TXQs are used for management
packets since those TXQs won't see a lot of traffic that'd
make them catch up later.

Cc: stable@vger.kernel.org
Fixes: 4856bfd23098 ("mac80211: do not call driver wake_tx_queue op during reconfig")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211129152938.4573a221c0e1.I0d1d5daea3089be3fc0dccc92991b0f8c5677f0c@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mac80211/driver-ops.h

index bcdfd19a596be1d352b48b3fa0ebad1277a0cc46..a172f69c71123b9f2ab01798150c3caf4c21e28c 100644 (file)
@@ -1201,8 +1201,11 @@ static inline void drv_wake_tx_queue(struct ieee80211_local *local,
 {
        struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->txq.vif);
 
-       if (local->in_reconfig)
+       /* In reconfig don't transmit now, but mark for waking later */
+       if (local->in_reconfig) {
+               set_bit(IEEE80211_TXQ_STOP_NETIF_TX, &txq->flags);
                return;
+       }
 
        if (!check_sdata_in_driver(sdata))
                return;