All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Felix Fietkau <nbd@nbd.name>,
	make-wifi-fast@lists.bufferbloat.net,
	linux-wireless@vger.kernel.org
Cc: Rajkumar Manoharan <rmanohar@codeaurora.org>, Kan Yan <kyan@google.com>
Subject: Re: [RFC/RFT] mac80211: Switch to a virtual time-based airtime scheduler
Date: Fri, 08 Mar 2019 20:06:00 +0100	[thread overview]
Message-ID: <87mum55gpz.fsf@toke.dk> (raw)
In-Reply-To: <a2b4c6c5-7b49-b809-a087-73548954e0bf@nbd.name>

Felix Fietkau <nbd@nbd.name> writes:

> On 2019-03-08 12:05, Toke Høiland-Jørgensen wrote:
>> Felix Fietkau <nbd@nbd.name> writes:
>> 
>>> On 2019-02-15 18:05, Toke Høiland-Jørgensen wrote:
>>>> This switches the airtime scheduler in mac80211 to use a virtual time-based
>>>> scheduler instead of the round-robin scheduler used before. This has a
>>>> couple of advantages:
>>>> 
>>>> - No need to sync up the round-robin scheduler in firmware/hardware with
>>>>   the round-robin airtime scheduler.
>>>> 
>>>> - If several stations are eligible for transmission we can schedule both of
>>>>   them; no need to hard-block the scheduling rotation until the head of the
>>>>   queue has used up its quantum.
>>>> 
>>>> - The check of whether a station is eligible for transmission becomes
>>>>   simpler (in ieee80211_txq_may_transmit()).
>>>> 
>>>> The drawback is that scheduling becomes slightly more expensive, as we need
>>>> to maintain an rbtree of TXQs sorted by virtual time. This means that
>>>> ieee80211_register_airtime() becomes O(logN) in the number of currently
>>>> scheduled TXQs. However, hopefully this number rarely grows too big (it's
>>>> only TXQs currently backlogged, not all associated stations), so it
>>>> shouldn't be too big of an issue.
>>>> 
>>>> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
>>> The approach looks good to me, but I haven't really reviewed it very
>>> carefully yet. Just some points that I noticed below:
>> 
>> Cool!
>> 
>>>> diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
>>>> index 11f058987a54..9d01fdd86e2d 100644
>>>> --- a/net/mac80211/sta_info.c
>>>> +++ b/net/mac80211/sta_info.c
>>>> @@ -389,7 +389,6 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
>>>>  	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
>>>>  		skb_queue_head_init(&sta->ps_tx_buf[i]);
>>>>  		skb_queue_head_init(&sta->tx_filtered[i]);
>>>> -		sta->airtime[i].deficit = sta->airtime_weight;
>>>>  	}
>>>>  
>>>>  	for (i = 0; i < IEEE80211_NUM_TIDS; i++)
>>>> @@ -1831,18 +1830,32 @@ void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid,
>>>>  {
>>>>  	struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
>>>>  	struct ieee80211_local *local = sta->sdata->local;
>>>> +	struct ieee80211_txq *txq = sta->sta.txq[tid];
>>>>  	u8 ac = ieee80211_ac_from_tid(tid);
>>>> -	u32 airtime = 0;
>>>> +	u64 airtime = 0, weight_sum;
>>>> +
>>>> +	if (!txq)
>>>> +		return;
>>>>  
>>>>  	if (sta->local->airtime_flags & AIRTIME_USE_TX)
>>>>  		airtime += tx_airtime;
>>>>  	if (sta->local->airtime_flags & AIRTIME_USE_RX)
>>>>  		airtime += rx_airtime;
>>>>  
>>>> +	/* Weights scale so the unit weight is 256 */
>>>> +	airtime <<= 8;
>>>> +
>>>>  	spin_lock_bh(&local->active_txq_lock[ac]);
>>>> +
>>>>  	sta->airtime[ac].tx_airtime += tx_airtime;
>>>>  	sta->airtime[ac].rx_airtime += rx_airtime;
>>>> -	sta->airtime[ac].deficit -= airtime;
>>>> +
>>>> +	weight_sum = local->airtime_weight_sum[ac] ?: sta->airtime_weight;
>>>> +
>>>> +	local->airtime_v_t[ac] += airtime / weight_sum;
>>>> +	sta->airtime[ac].v_t += airtime / sta->airtime_weight;
>>>> +	ieee80211_resort_txq(&local->hw, txq);
>>> These divisions could be a bit expensive, any way to change the
>>> calculation to avoid them?
>> 
>> Yeah, given that the denominators are constant from the PoV of the fast
>> path, we can pre-compute reciprocals and turn these divides into
>> multiplications. Will incorporate that...
> Sounds good.
>
>>> I'm a bit worried about this part. Does that mean that vif txqs always
>>> have priority over sta txqs?
>> 
>> Yeah, it does. This sort of mirrors what the existing airtime scheduler
>> does (because VIFs don't have an airtime deficit), but because it's a
>> round-robin scheduler the effect is less severe as long as there are
>> stations able to transmit.
>> 
>> I guess the obvious fix is to start accounting airtime usage for the VIF
>> as well? We may want to do that in any case, as that would also give
>> users a convenient way to set policy for multicast traffic. Any
>> objections to this?
> I think this is a good idea.

Great, thanks! I'll do a separate patch for accounting airtime for the
VIF queue, and then respin this on top. Will probably be a little while
before I get around to it, though.

-Toke

  reply	other threads:[~2019-03-08 19:06 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-15 17:05 [RFC/RFT] mac80211: Switch to a virtual time-based airtime scheduler Toke Høiland-Jørgensen
2019-02-15 19:44 ` [Make-wifi-fast] " Dave Taht
2019-03-05 15:45 ` Toke Høiland-Jørgensen
2019-03-06 23:09   ` Rajkumar Manoharan
2019-03-07  9:46     ` Toke Høiland-Jørgensen
2019-03-07 14:27 ` Felix Fietkau
2019-03-08 11:05   ` Toke Høiland-Jørgensen
2019-03-08 18:16     ` Felix Fietkau
2019-03-08 19:06       ` Toke Høiland-Jørgensen [this message]
2019-04-04  4:41 ` Yibo Zhao
2019-04-04  4:43   ` Yibo Zhao
2019-04-04  5:00 ` Yibo Zhao
2019-04-04  8:31   ` Toke Høiland-Jørgensen
2019-04-04  8:36     ` [Make-wifi-fast] " Dave Taht
2019-04-04  8:50       ` Toke Høiland-Jørgensen
2019-04-09 13:25     ` Yibo Zhao
2019-04-09 20:41       ` Toke Høiland-Jørgensen
2019-04-10  6:35         ` Yibo Zhao
2019-04-10 10:40           ` Toke Høiland-Jørgensen
2019-04-11  3:12             ` Yibo Zhao
2019-04-11 11:24               ` Toke Høiland-Jørgensen
2019-04-12  6:34                 ` Yibo Zhao
2019-04-19 15:05                 ` Yibo Zhao
2019-04-20 21:15                   ` Toke Høiland-Jørgensen
2019-04-30  9:45                     ` Yibo Zhao
2019-04-30 10:39                       ` 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87mum55gpz.fsf@toke.dk \
    --to=toke@redhat.com \
    --cc=kyan@google.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.