On 2020-02-26 22:56, Toke Høiland-Jørgensen wrote: > Felix Fietkau <nbd@xxxxxxxx> writes: >> - We need an API that allows the driver to change the pending airtime >> values, e.g. subtract estimated tx time for a packet. >> mt76 an ath9k can queue packets inside the driver that are not currently >> in the hardware queues. Typically if the txqs have more data than what >> gets put into the hardware queue, both drivers will pull an extra frame >> and queue it in its private txq struct. This frame will get used on the >> next txq scheduling round for that particular station. >> If you have lots of stations doing traffic (or having driver buffered >> frames in powersave mode), this could use up a sizable chunk of the AQL >> budget. > > I'm a bit more skeptical about this. If the driver buffers a bunch of > packets that are not accounted that will hurt that station due to extra > latency when it wakes up. For ath9k, this is the retry_q you're talking > about, right? The number of packets queued on that is fairly limited, > isn't it? What kind of powersave buffering is the driver doing, and why > can't it leave the packets on the TXQ? That would allow them to be > scheduled along with any new ones that might have arrived in the > meantime, which would be a benefit for latency. For mt76 there should be max. 1 frame in the retry queue, it's just a frame that was pulled from the txq in a transmission attempt but that it couldn't put in the hw queue because it didn't fit in the current aggregate batch. If such a frame is in the retry queue and the sta ends up switching to powersave mode, that frame stays buffered in the driver queue until the sta wakes up. > I can see how it can be a problem that many stations in powersave can > block transmissions for *other* stations, though. Maybe an alternative > to the driver subtracting airtime could be to have mac80211 do something > like this when a station is put into powersave mode: > > local->aql_total_pending_airtime -= sum(sta->airtime[ac].aql_tx_pending) > > (where sum is the summation over all ACs) > > and the reverse when the station wakes back up? That should keep the > whole device from throttling but still prevent a big queue building up > for that sta when it wakes back up. Would that work, do you think? That solves most of the issue but is still incomplete. It also gets tricky when the driver starts pulling dequeueing packets in powersave mode (e.g. on PS-Poll). The remaining corner case is when there are a large number of stations that each have a single frame in their retry queue (see above). Having those frames counted for pending airtime could reduce the aggregation size for each station, even though those frames are not in the hw queue. - Felix