Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxx> writes: > This allows the driver to refill airtime fairness deficit > where the driver will not access txqs by ieee80211_next_txq. > In tx push mode data path, high priority txqs will be scheduled > for data transmission by ieee80211_next_txq and driver will not > prioritize txqs whereas in push-pull mode, the drivers can > prioritize txqs and access them directly. In such mode, airtime > deficit can not filled by ieee80211_next_txq. > > Signed-off-by: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxx> > --- > include/net/mac80211.h | 15 +++++++++++++ > net/mac80211/tx.c | 59 +++++++++++++++++++++++++++++++++++--------------- > 2 files changed, 57 insertions(+), 17 deletions(-) > > diff --git a/include/net/mac80211.h b/include/net/mac80211.h > index cc16847bd52d..a2f0b6800100 100644 > --- a/include/net/mac80211.h > +++ b/include/net/mac80211.h > @@ -6033,6 +6033,21 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw, > struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac); > > /** > + * ieee80211_reorder_txq - change txq position in scheduling loop > + * > + * This function is used to reorder txq's position in scheduling loop. > + * The txq fairness deficit will be refilled. The drivers calling this > + * function should ensure the txq won't be accessed by ieee80211_next_txq > + * in the same path. > + * > + * @hw: pointer as obtained from ieee80211_alloc_hw() > + * @txq: pointer obtained from station or virtual interface > + * > + */ > +void ieee80211_reorder_txq(struct ieee80211_hw *hw, > + struct ieee80211_txq *txq); > + > +/** > * ieee80211_txq_get_depth - get pending frame/byte count of given txq > * > * The values are not guaranteed to be coherent with regard to each other, i.e. > diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c > index 0af35c08e0d9..b7b2f93152f8 100644 > --- a/net/mac80211/tx.c > +++ b/net/mac80211/tx.c > @@ -3634,10 +3634,38 @@ static inline struct txq_info *find_txqi(struct ieee80211_local *local, s8 ac) > return txqi; > } > > +static bool ieee80211_txq_refill_deficit(struct ieee80211_local *local, > + struct txq_info *txqi) > +{ > + struct fq *fq = &local->fq; > + struct sta_info *sta; > + > + lockdep_assert_held(&local->active_txq_lock); > + > + if (!txqi->txq.sta) > + return false; > + > + sta = container_of(txqi->txq.sta, struct sta_info, sta); > + > + if (sta->airtime.deficit[txqi->txq.ac] > 0) > + return false; > + > + sta->airtime.deficit[txqi->txq.ac] += > + IEEE80211_AIRTIME_QUANTUM * sta->airtime.weight; > + list_move_tail(&txqi->schedule_order, > + &local->active_txqs[txqi->txq.ac]); This needs to check that the txq is currently at the head of local->active_txqs[txqi->txq.ac]; otherwise fairness enforcement doesn't work. And with this check I'm not sure the reorder function is terribly useful for what you want to use it for? -Toke