From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <36RTKXQQKDjAWkMZSaaSXQ.OaYYMWQ-iURU-RMefXUefe.NgRRQdNXaMf.ZQf@flex--kyan.bounces.google.com> Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.bufferbloat.net (Postfix) with ESMTPS id 60C923CB39 for ; Mon, 11 Nov 2019 21:11:54 -0500 (EST) Received: by mail-pg1-x549.google.com with SMTP id k7so13394537pgq.10 for ; Mon, 11 Nov 2019 18:11:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=jp9mmRjzmSt3M5pfqQBklbI8/K34oEiVaxLBlUf62iU=; b=uHpSpIu1vpKtjUdIED6xRi5HLaACQTDweoq5l2O+S/PwKpkSeEA7KXkf4XeEf+yRe7 ipdo0xkhiatBrzRZAXEOxa2ELmNcbFVnbBvrp4FyVg9w0OoLd78bTsjp0N7chbkJ0TpW /VfabtdLLE0fdzhJt9oBdujxHWBtCFuau5lrKmZ7YioZS9BssLgn7W7EbMJ94Vw5GYw1 hGZOXRPRKsElHqtRccMKIouWXfP2aT1OR6rOCZG3wFEnHYt8TCYiW6vAiVGQeqlYcER7 bRbIfr8O5T4awVjDxnxw3/OYk+lry8Mg1aFFLRq5ReFw/rc/D3lR+eiv1Vt6KGGyk7Js XvDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=jp9mmRjzmSt3M5pfqQBklbI8/K34oEiVaxLBlUf62iU=; b=VKivK6dnvYeX9Yk7BOMyOXydG3wLNBUfpQTzlP8PxsKjxe/wfJWBjKT8jIP8Fh5KVp m5tzhohy0j8XYt+vjh3XbB+K5bSAuYoItatxnPYV7t8Dy9oscSxK31vPTkG/C4AiM3gb 1FS3ruORrM5yT13utBUFxizOsxR1/PnI9MN78O7P+2qdyXf8p9EbWdGOT5SjexCFpgF7 IGzEGVt2syqz8DGqqobDBlkHuinDVF6y+24i2fKoVORgfYgKPe49SHq1nHquDH/9XGTm qXuc/Uc41OejyHzpJSwxDYIKZ0LBoUH6C9d/Q9pWuNMIS9KFHr892Hi9xd1ddOlqFv+g Ltbw== X-Gm-Message-State: APjAAAXeM/nkeiWNXu6BZtrWhmGyUb+yiZcOGsf72IzCyLiW3UjQSRr4 V+A22BMXeNxlOsYMa67V2OOtfEi4 X-Google-Smtp-Source: APXvYqzfq+qe9TXj9tPrLFR2OPmebDmH3HuCgAfxuIHF5qxX8IRPJlcodfeDRIWy9xnHSwoQfd9BGupS X-Received: by 2002:a63:d951:: with SMTP id e17mr31588368pgj.243.1573524713415; Mon, 11 Nov 2019 18:11:53 -0800 (PST) Date: Mon, 11 Nov 2019 18:11:36 -0800 In-Reply-To: <20191112021136.42918-1-kyan@google.com> Message-Id: <20191112021136.42918-3-kyan@google.com> Mime-Version: 1.0 References: <20191112021136.42918-1-kyan@google.com> X-Mailer: git-send-email 2.24.0.rc1.363.gb1bccd3e3d-goog From: Kan Yan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, make-wifi-fast@lists.bufferbloat.net, toke@redhat.com, nbd@nbd.name, yiboz@codeaurora.org, john@phrozen.org, lorenzo@kernel.org, rmanohar@codeaurora.org, kevinhayes@google.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: [Make-wifi-fast] [PATCH v7 2/2] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue X-BeenThere: make-wifi-fast@lists.bufferbloat.net X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Nov 2019 02:11:54 -0000 From: Toke H=C3=B8iland-J=C3=B8rgensen The previous commit added the ability to throttle stations when they queue too much airtime in the hardware. This commit enables the functionality by calculating the expected airtime usage of each packet that is dequeued from the TXQs in mac80211, and accounting that as pending airtime. The estimated airtime for each skb is stored in the tx_info, so we can subtract the same amount from the running total when the skb is freed or recycled. The throttling mechanism relies on this accounting to be accurate (i.e., that we are not freeing skbs without subtracting any airtime they were accounted for), so we put the subtraction into ieee80211_report_used_skb(). As an optimisation, we also subtract the airtime on regular TX completion, zeroing out the value stored in the packet afterwards, to avoid having to do an expensive lookup of the station from the packet data on every packet. This patch does *not* include any mechanism to wake a throttled TXQ again, on the assumption that this will happen anyway as a side effect of whatever freed the skb (most commonly a TX completion). Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen --- net/mac80211/status.c | 33 +++++++++++++++++++++++++++++++++ net/mac80211/tx.c | 21 +++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/net/mac80211/status.c b/net/mac80211/status.c index ab8ba5835ca0..ae15c8fd2421 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c @@ -676,6 +676,28 @@ static void ieee80211_report_used_skb(struct ieee80211= _local *local, if (dropped) acked =3D false; =20 + if (info->tx_time_est) { + struct sta_info *sta =3D NULL, *s; + struct rhlist_head *tmp; + + rcu_read_lock(); + + for_each_sta_info(local, hdr->addr1, s, tmp) { + /* skip wrong virtual interface */ + if (!ether_addr_equal(hdr->addr2, s->sdata->vif.addr)) + continue; + + sta =3D s; + break; + } + + ieee80211_sta_update_pending_airtime(local, sta, + skb_get_queue_mapping(skb), + info->tx_time_est << 2, + true); + rcu_read_unlock(); + } + if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { struct ieee80211_sub_if_data *sdata; =20 @@ -986,6 +1008,17 @@ static void __ieee80211_tx_status(struct ieee80211_hw= *hw, ieee80211_sta_register_airtime(&sta->sta, tid, info->status.tx_time, 0); =20 + if (info->tx_time_est) { + /* Do this here to avoid the expensive lookup of the sta + * in ieee80211_report_used_skb(). + */ + ieee80211_sta_update_pending_airtime(local, sta, + skb_get_queue_mapping(skb), + info->tx_time_est << 2, + true); + info->tx_time_est =3D 0; + } + if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { if (info->flags & IEEE80211_TX_STAT_ACK) { if (sta->status_stats.lost_packets) diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index f53d56ef535a..583211ca670d 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3549,6 +3549,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211= _hw *hw, =20 WARN_ON_ONCE(softirq_count() =3D=3D 0); =20 + if (!ieee80211_txq_airtime_check(hw, txq)) + return NULL; + begin: spin_lock_bh(&fq->lock); =20 @@ -3659,6 +3662,24 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee8021= 1_hw *hw, } =20 IEEE80211_SKB_CB(skb)->control.vif =3D vif; + + if (local->airtime_flags & AIRTIME_USE_AQL) { + u32 airtime; + + airtime =3D ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta, + skb->len); + if (airtime) { + /* We only have 10 bits in tx_time_est, so store airtime + * in increments of 4us and clamp the maximum to 2**12-1 + */ + airtime =3D min_t(u32, airtime, 4095) & ~3U; + info->tx_time_est =3D airtime >> 2; + ieee80211_sta_update_pending_airtime(local, tx.sta, + txq->ac, airtime, + false); + } + } + return skb; =20 out: --=20 2.24.0.rc1.363.gb1bccd3e3d-goog