From: "Toke Høiland-Jørgensen" <toke@toke.dk>
To: Rajkumar Manoharan <rmanohar@codeaurora.org>
Cc: linux-wireless@vger.kernel.org,
make-wifi-fast@lists.bufferbloat.net,
Felix Fietkau <nbd@nbd.name>,
linux-wireless-owner@vger.kernel.org
Subject: Re: [Make-wifi-fast] [RFC v2 1/4] mac80211: Add TXQ scheduling API
Date: Fri, 13 Jul 2018 15:39:55 +0200 [thread overview]
Message-ID: <87h8l39rv8.fsf@toke.dk> (raw)
In-Reply-To: <f8038c8ea281b365ec560cae0dd1ec0f@codeaurora.org>
Rajkumar Manoharan <rmanohar@codeaurora.org> writes:
> On 2018-07-12 16:13, Toke Høiland-Jørgensen wrote:
>> Rajkumar Manoharan <rmanohar@codeaurora.org> writes:
>>
>>> On 2018-07-11 13:48, Toke Høiland-Jørgensen wrote:
>>>> Rajkumar Manoharan <rmanohar@codeaurora.org> writes:
>>>>
>>>>> On 2018-07-09 09:37, Toke Høiland-Jørgensen wrote:
>>>>> [...]
>>>>>> +/**
> [...]
>
>>>> Erm, how would this prevent an infinite loop? With this scheme, at
>>>> some
>>>> point, ieee80211_next_txq() removes the last txq from activeq, and
>>>> returns that. Then, when it is called again the next time the driver
>>>> loops, it's back to the first case (activeq empty, waitq non-empty);
>>>> so
>>>> it'll move waitq back as activeq and start over... Only the driver
>>>> really knows when it is starting a logical "loop through all active
>>>> TXQs".
>>>>
>>> Oops.. My bad.. The idea is that ieee80211_next_txq process txq from
>>> activeq only and keep processed txqs separately. Having single list
>>> eventually needs tracking mechanism. The point is that once activeq
>>> becomes empty, splice waitq list and return NULL. So that driver can
>>> break from the loop.
>>>
>>> ieee80211_next_txq
>>> - if activeq empty,
>>> - move waitq list into activeq
>>> - return NULL
>>>
>>> - if activeq not empty
>>> - fetch appropriate txq from activeq
>>> - remove txq from activeq list.
>>>
>>> - If txq found, return txq else return NULL
>>
>> Right, so this would ensure the driver only sees each TXQ once *if it
>> keeps looping*. But it doesn't necessarily; if the hardware queues fill
>> up, for instance, it might abort earlier. In that case it would need to
>> signal mac80211 that it is done for now, which is equivalent to
>> signalling when it starts a scheduler round.
>>
> Hmm... I thought driver will call ieee80211_schedule_txq when it runs
> out of hardware descriptor and break the loop. The serving txq will be
> added back to head of activeq list. no?
Yes, and then the next one will be serviced... It's basically:
while (!hwq_is_full()) {
txq = next_txq():
build_one_aggr(txq); // may or may not succeed
if (!empty(txq))
schedule_txq(txq);
}
It is not generally predictable how many times this will loop before
exiting...
>>>> Also, for airtime fairness, the queues are not scheduled strictly
>>>> round-robin, so the dual-list scheme wouldn't work there either...
>>>>
>>> As you know, ath10k driver will operate in two tx modes (push-only,
>>> push-pull). These modes will be switched dynamically depends on
>>> firmware load or resource availability. In push-pull mode, firmware
>>> will query N number of frames for set of STA, TID.
>>
>> Ah, so it will look up the TXQ without looping through the list of
>> pending queues at all? Didn't realise that is what it's doing; yeah,
>> that would be problematic for airtime fairness :)
>>
>>> So the driver will directly dequeue N number of frames from given txq.
>>> In this case txq ordering alone wont help. I am planning to add below
>>> changes in exiting API and add new API ieee80211_reorder_txq.
>>>
>>> ieee80211_txq_get_depth
>>> - return deficit status along with frm_cnt
>>>
>>> ieee80211_reorder_txq
>>> - if txq deficit > 0
>>> - return;
>>> - if txq is last
>>> - return
>>> - delete txq from list
>>> - move it to tail
>>> - update deficit by quantum
>>>
>>> ath10k_htt_rx_tx_fetch_ind
>>> - get txq deficit status
>>> - if txq deficit > 0
>>> - dequeue skb
>>> - else if deficit < 0
>>> - return NULL
>>>
>>> Please share your thoughts.
>>
>> Hmm, not sure exactly how this would work; seems a little complicated?
>> Also, I'd rather if drivers were completely oblivious to the deficit;
>> that is a bit of an implementation detail...
>>
> Agree.. Initially I thought of adding deficit check in
> ieee80211_tx_dequeue.
> But It will be overhead of taking activeq_lock for every skbs. Perhaps
> it can be renamed as allowed_to_dequeue instead of deficit.
>
>> We could have an ieee80211_txq_may_pull(); or maybe just have
>> ieee80211_tx_dequeue() return NULL if the deficit is negative?
>>
> As I said earlier, checking deficit for every skb will be an overhead.
> It should be done once before accessing txq.
Well, it could conceivably be done in a way that doesn't require taking
the activeq_lock. Adding another STOP flag to the TXQ, for instance.
From an API point of view I think that is more consistent with what we
have already...
>> the reasonable thing for the driver to do, then, would be to ask
>> ieee80211_next_txq() for another TXQ to pull from if the current one
>> doesn't work for whatever reason.
>>
>> Would that work for push-pull mode?
>>
> Not really. Driver shouldn't send other txq data instead of asked one.
I didn't necessarily mean immediately. As long as it does it eventually.
If a TXQ's deficit runs negative, that TXQ will not be allowed to send
again until its deficit has been restored to positive through enough
cycles of the loop in next_txq().
> In MU-MIMO, firmware will query N packets from given set of {STA,TID}.
> So the driver not supposed to send other txq's data.
Hmm, it'll actually be interesting to see how the airtime fairness
scheduler interacts with MU-MIMO. I'm not quite sure that it'll be in a
good way; the DRR scheduler generally only restores one TXQ to positive
deficit at a time, so it may be that MU-MIMO will break completely and
we'll have to come up with another scheduling algorithm.
How does the firmware the airtime of a MU-MIMO transmission to each of
the involved stations?
-Toke
next prev parent reply other threads:[~2018-07-13 13:40 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-09 16:37 [Make-wifi-fast] [RFC v2 0/4] Move TXQ scheduling into mac80211 Toke Høiland-Jørgensen
2018-07-09 16:37 ` [Make-wifi-fast] [RFC v2 1/4] mac80211: Add TXQ scheduling API Toke Høiland-Jørgensen
2018-07-11 0:14 ` Rajkumar Manoharan
2018-07-11 20:48 ` Toke Høiland-Jørgensen
2018-07-12 22:40 ` Rajkumar Manoharan
2018-07-12 23:13 ` Toke Høiland-Jørgensen
2018-07-13 0:33 ` Rajkumar Manoharan
2018-07-13 13:39 ` Toke Høiland-Jørgensen [this message]
2018-07-17 1:06 ` Rajkumar Manoharan
2018-07-19 14:18 ` Toke Høiland-Jørgensen
2018-07-21 1:01 ` Rajkumar Manoharan
2018-07-21 20:54 ` Toke Høiland-Jørgensen
2018-07-24 0:42 ` Rajkumar Manoharan
2018-07-24 11:08 ` Toke Høiland-Jørgensen
2018-07-30 21:10 ` Rajkumar Manoharan
2018-07-30 22:48 ` Toke Høiland-Jørgensen
2018-07-31 0:19 ` Rajkumar Manoharan
2018-08-29 7:36 ` Johannes Berg
2018-08-29 9:22 ` Toke Høiland-Jørgensen
2018-08-29 9:24 ` Johannes Berg
2018-08-29 10:09 ` Toke Høiland-Jørgensen
2018-07-09 16:37 ` [Make-wifi-fast] [RFC v2 3/4] cfg80211: Add airtime statistics and settings Toke Høiland-Jørgensen
2018-07-09 16:37 ` [Make-wifi-fast] [RFC v2 4/4] ath9k: Switch to mac80211 TXQ scheduling and airtime APIs Toke Høiland-Jørgensen
2018-07-09 16:37 ` [Make-wifi-fast] [RFC v2 2/4] mac80211: Add airtime accounting and scheduling to TXQs Toke Høiland-Jørgensen
2018-08-29 7:44 ` Johannes Berg
2018-08-29 9:27 ` Toke Høiland-Jørgensen
2018-08-29 10:14 ` Johannes Berg
2018-08-29 10:33 ` Toke Høiland-Jørgensen
2018-08-29 10:40 ` Johannes Berg
2018-08-29 14:16 ` Toke Høiland-Jørgensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://lists.bufferbloat.net/postorius/lists/make-wifi-fast.lists.bufferbloat.net/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h8l39rv8.fsf@toke.dk \
--to=toke@toke.dk \
--cc=linux-wireless-owner@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=make-wifi-fast@lists.bufferbloat.net \
--cc=nbd@nbd.name \
--cc=rmanohar@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox