mac80211: fix a regression in the broadcast AQL patch
authorFelix Fietkau <nbd@nbd.name>
Fri, 8 Mar 2024 21:42:50 +0000 (22:42 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 8 Mar 2024 21:46:32 +0000 (22:46 +0100)
The AQL limit for buffered broadcast packets is higher than the maximum
total pending airtime limit. This can get unicast data stuck whenever there
is too much pending broadcast data. Fix this by excluding broadcast AQL from
the total limit.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch

index 6f64467b6641494f9a13258b2c6e0c8adf0322b0..f117a68c165049d20a894e5f4089c3fbe5841254 100644 (file)
@@ -95,12 +95,13 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                spin_lock_init(&local->active_txq_lock[i]);
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -2341,28 +2341,27 @@ void ieee80211_sta_update_pending_airtim
+@@ -2341,29 +2341,33 @@ void ieee80211_sta_update_pending_airtim
                                          struct sta_info *sta, u8 ac,
                                          u16 tx_airtime, bool tx_completed)
  {
+-      int tx_pending;
++      int tx_pending = 0;
 +      atomic_t *counter;
-       int tx_pending;
  
        if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL))
                return;
@@ -113,9 +114,18 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +              counter = &sta->airtime[ac].aql_tx_pending;
 +      else
 +              counter = &local->aql_bc_pending_airtime;
++
++      if (!tx_completed)
++              atomic_add(tx_airtime, counter);
++      else
++              tx_pending = atomic_sub_return(tx_airtime, counter);
++      if (tx_pending < 0)
++              atomic_cmpxchg(counter, tx_pending, 0);
++
++      if (!sta)
++              return;
  
 +      if (!tx_completed) {
-+              atomic_add(tx_airtime, counter);
                atomic_add(tx_airtime, &local->aql_total_pending_airtime);
                atomic_add(tx_airtime, &local->aql_ac_pending_airtime[ac]);
                return;
@@ -128,12 +138,10 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -                      atomic_cmpxchg(&sta->airtime[ac].aql_tx_pending,
 -                                     tx_pending, 0);
 -      }
-+      tx_pending = atomic_sub_return(tx_airtime, counter);
-+      if (tx_pending < 0)
-+              atomic_cmpxchg(counter, tx_pending, 0);
+-
        atomic_sub(tx_airtime, &local->aql_total_pending_airtime);
        tx_pending = atomic_sub_return(tx_airtime,
+                                      &local->aql_ac_pending_airtime[ac]);
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
 @@ -3958,9 +3958,8 @@ begin: