Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp6957935ybx; Mon, 11 Nov 2019 18:13:41 -0800 (PST) X-Google-Smtp-Source: APXvYqyWKPQ84JxK9H1E3zgKQE2P4OIe9a4ofhRzB8710WD+7oWE7CaeOoO0STWGhiebRQXUOcE2 X-Received: by 2002:a17:906:1505:: with SMTP id b5mr26268653ejd.195.1573524821264; Mon, 11 Nov 2019 18:13:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573524821; cv=none; d=google.com; s=arc-20160816; b=BobIYdMEj/aR1jaT9OkSFypekx8k/dgzLs1IdMEh/uTlBPHGj6b+jk1MZ7BbRzd5Dg bScNfU0CDpwz97Ih/P2bQL90KkjSaBkFtWlvF/hzLZqHxjwGXjItD2rHBrNb2QPEh2C7 pqIsYixGh3kgBUjADvzw6wlVAFtKNLedmk+iGD0x83CJKwSnu+7cgHDrfiXkFldzUgEM N/223orh3ml8a2egdIvFFj6jtVFaUlciVVyU84Ye4AcZkQJVqsiAoPzr28MxaBSdc4n4 1jaR/obCpZRKiMMG/MhaHjKuyFMqp8xSErRKdvUKx/O+TaL2SLEw7PF02QqIE6l5AVLp DArA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:from :subject:references:mime-version:message-id:in-reply-to:date :dkim-signature; bh=jp9mmRjzmSt3M5pfqQBklbI8/K34oEiVaxLBlUf62iU=; b=xjEgxQoR5kG58FHRew0wtnQZShYp9iiGfEeL+9FOTKIR9qJYTCtyqEeCkHfdpdt0aK vG9fBZL/KY52RshO834EOzqM+yC3c+4wAHbmCblNzJPKq9evUa8ljiMxeidKljdeVcZt XpjtBbMas44JCEzaHYi3g2aSdK2GXQ9bdTVlupSTAzQpTZplwQF7Q1u2D9R3s7iLrehU V5YOSniPz0xKpjzGw+IDfCFrakwrIG/Sh4sO9tQUJv7d8189ZLr1LdbRqGZaRA59C8M5 Mr4atnDvrqK3gZurCz9kVuosVRuEIiFysxJgVXuOVhcwZ8Xv2n3egk2zPBOGGcBPeImx kmuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=uHpSpIu1; spf=pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k15si11026600ejc.331.2019.11.11.18.13.03; Mon, 11 Nov 2019 18:13:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=uHpSpIu1; spf=pass (google.com: best guess record for domain of linux-wireless-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727321AbfKLCLy (ORCPT + 99 others); Mon, 11 Nov 2019 21:11:54 -0500 Received: from mail-pg1-f202.google.com ([209.85.215.202]:52488 "EHLO mail-pg1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726924AbfKLCLy (ORCPT ); Mon, 11 Nov 2019 21:11:54 -0500 Received: by mail-pg1-f202.google.com with SMTP id 32so11146942pgy.19 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=E+rGHolTlu0dol11kwYVn5IWA1g9GdJc1RaRZOcvoa4aROYRrKBUAuHlE+dS38oF7/ iUeVpN96vFHznBx1AM7BqtX/bggkKZOmmKh+Dp+xMkUEYALCiCdhGNUWDDoWwztJQdUy eAHBkyEcH9Tncv6dMrJ76BTrMtCLt0jlDw5wywWazcPjRB+GNaNWCHeLlNlRyQq5gVRX gDOPOvU2BnABdtxGkJr77t5ba0qdIMHmvAc/g4xma6fh6cSCEOqkdnRVJIGTNdxS9/c2 vEt4v92q2LQGfuMqvXdDZXIixliEddQkuOceW5GAYHXQ3AOo6Eu8NOCJ9FDYjxnRp/9h 3hHA== X-Gm-Message-State: APjAAAUCNa3ESI27Ic9VJCDhCQ7n6hVs696uQobKUi0zp1zoyGjsl74I 7rtR07kFwRzF9UYETf3y//6Tj78U 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 Subject: [PATCH v7 2/2] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue 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 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 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