Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp5214755ybg; Mon, 21 Oct 2019 23:21:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqzhekSS0UneFn5BoRfgMhkAXV/5bnjh5zCCRmCzbSftZtOzkHvdcCADuC/ZsPESOdp2osrB X-Received: by 2002:a17:906:9504:: with SMTP id u4mr4952203ejx.317.1571725297309; Mon, 21 Oct 2019 23:21:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571725297; cv=none; d=google.com; s=arc-20160816; b=D9zZ6g1LHdmASMj0QK0jQAJdHnaOnl6jLb+YgYloX+W1y26g/TDmb32CvF7i4M7Qmu xrzbXqw9TE960QvY4D4zubenUzJ+rUJYVOd5ZoaUTGEMQq1V12N+1Ut7RTMRRSXnAQen c3uv0at6WHi8oLye53nh1SVawUWQfAEHT+pwcK8+A3ECmiwoAzCwCd7bFBm3R7CSEU9P CWUSY5fVdVW9YwLpAysfWJtQdL9aWWlDwFDY7aglI3pXV8KNLEUig7FPTF3O648/PhQU c/iFW47zTJqXgufGjE5O0Q3u05Vuq0yOzE5Oimvhp+LvXDW6HWyur5dMoOU+Ieb2VSgm yqjA== 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:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=P89YVq7mabnbReOmcuX3tbFnU1/HsoCVT0wVL7HYmgo=; b=vFBv4kMbjbCr3hMaDV82OhLVAG5eCcztXf9W/BmEgqcbhPePWWI4iMpLyGCX3o1Hg3 YrRJZyfBDAiD1nDAFmy2wDQHm4tlQGJTTwz9JzgCsLNghmNLRCp+2nsL35T7jDIR5Q1Z FbKm0KhwqxbK4f0ri+luvOaVi3Bnu5M4dgycjCYqUCa15koO0UTTz82t5BnbuBoyMwWI Q48MLA/vhmi22POnOG0W0BIbO19a29vLR6vKL0g7g3Ddzvy43DXoteEMcGft1MZCmBFz eMMbX9n5QAN8I1HIba8xbS7ZOpHod7dH27DeESXTQcMtNAcrtJgKOmbN76PWkGvCGXXh dzVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=H6fbYWTq; 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 t18si10221391ejr.416.2019.10.21.23.21.13; Mon, 21 Oct 2019 23:21:37 -0700 (PDT) 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=H6fbYWTq; 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 S1731040AbfJVGUt (ORCPT + 99 others); Tue, 22 Oct 2019 02:20:49 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:44502 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725788AbfJVGUt (ORCPT ); Tue, 22 Oct 2019 02:20:49 -0400 Received: by mail-lf1-f67.google.com with SMTP id q12so12037135lfc.11 for ; Mon, 21 Oct 2019 23:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=P89YVq7mabnbReOmcuX3tbFnU1/HsoCVT0wVL7HYmgo=; b=H6fbYWTqwfAzUI0aZwG24lhF9WJY8zUGD2ZkDaEt8GdDT3wSosRcnrLTg5vgYNVQti xB5HLN+lsDlUxmw5ZwXpIOmfknFtbmHgejpU4A97IvOx1PPiW/lJEzROMOyUXQ4/4Mun KezH0Ku9mtAfva3+2KDK2dL2Lcnx0FFucpiemXhTcm4HjHVfEBQcMJeG4jl3NoY4x54A 4jdUHr3gyn03Fa6aTId0V5CPkB1fflYZs1Sv4H1a3HRqv3TSkpvmESxTofmTnhItZiyz 7lA76VICm3+uVUEPzJ0rG72KEUk2OuTkj71bOvxOMRuBgoVIBlVDHoNZ4C4sS76WncCB nYjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=P89YVq7mabnbReOmcuX3tbFnU1/HsoCVT0wVL7HYmgo=; b=UCtxSjK0d3Wkdl9kex/SjF66oQiBKD+3AMdQzzcf4llIVloT85cNbkslBEci8g92v3 C2mo/KVBEaXIaxbWHu6Cqm9BAY1brBymzpSv0acw2P736rvIEl7UdZ+wpLE3zAmMRVH5 U2vs6R0kjteYOt4QVnb5aq0ecRAVW8atqUgkF5uCyqz/7WAtv+1rrXNLaZOf8xMjCGRt 6Fgpnwc3qmXmraF7Xltpv3tquLM6S9QvsCaq5DC51AsEz0v1XAWr9q5ntCj4zaM30yYO LBMJkCFbbqnjWhq6m3ObQbla+NfAO2dnv+ucWq/1ESAbcCOShz5ULvHu3R+YFtzyofXL IvVw== X-Gm-Message-State: APjAAAV9fsPRzajKkJ12nrFEGYYGAeqNZBXmESmwSdbyh9FFpSLhxiCD mxKaCpDH/q8mVog5UoNq61xr0QCHIJt4FROI/Q1Gzw== X-Received: by 2002:a19:9144:: with SMTP id y4mr12326104lfj.168.1571725245884; Mon, 21 Oct 2019 23:20:45 -0700 (PDT) MIME-Version: 1.0 References: <157148503415.2989444.7391437309981941226.stgit@toke.dk> <157148503865.2989444.7118792679603045723.stgit@toke.dk> In-Reply-To: <157148503865.2989444.7118792679603045723.stgit@toke.dk> From: Kan Yan Date: Mon, 21 Oct 2019 23:20:34 -0700 Message-ID: Subject: Re: [PATCH v4 4/4] mac80211: Use Airtime-based Queue Limits (AQL) on packet dequeue To: =?UTF-8?B?VG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2Vu?= Cc: Johannes Berg , linux-wireless@vger.kernel.org, Make-Wifi-fast , ath10k@lists.infradead.org, John Crispin , Lorenzo Bianconi , Felix Fietkau , Rajkumar Manoharan , Kevin Hayes 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 > + if (ieee80211_is_data_qos(hdr->frame_control)) { > + qc =3D ieee80211_get_qos_ctl(hdr); > + tid =3D qc[0] & 0xf; > + ac =3D ieee80211_ac_from_tid(tid); > + } else { > + ac =3D IEEE80211_AC_BE; > + } The tid/ac is incorrect either here or in __ieee80211_tx_status() when tested with ath10k. The ac is set to AC_BE with test done using BK class traffic, hence the pending airtime get updated for the wrong txq. The rest of the patch seems to work as expected, after I did a quick hack to release the pending airtime from ath10k_txrx_tx_unref() instead, where the ac/tid can be directly retrieved from struck struct ieee80211_tx. On Sat, Oct 19, 2019 at 4:37 AM Toke H=C3=B8iland-J=C3=B8rgensen wrote: > > From: Toke H=C3=B8iland-J=C3=B8rgensen > > The previous commit added the ability to throttle stations when they queu= e > too much airtime in the hardware. This commit enables the functionality b= y > calculating the expected airtime usage of each packet that is dequeued fr= om > 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 whatev= er > freed the skb (most commonly a TX completion). > > Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen > --- > net/mac80211/status.c | 38 ++++++++++++++++++++++++++++++++++++++ > net/mac80211/tx.c | 21 +++++++++++++++++++++ > 2 files changed, 59 insertions(+) > > diff --git a/net/mac80211/status.c b/net/mac80211/status.c > index ab8ba5835ca0..905b4afd457d 100644 > --- a/net/mac80211/status.c > +++ b/net/mac80211/status.c > @@ -676,6 +676,33 @@ static void ieee80211_report_used_skb(struct ieee802= 11_local *local, > if (dropped) > acked =3D false; > > + if (info->tx_time_est) { > + struct ieee80211_sub_if_data *sdata; > + struct sta_info *sta =3D NULL; > + u8 *qc, ac; > + int tid; > + > + rcu_read_lock(); > + > + sdata =3D ieee80211_sdata_from_skb(local, skb); > + if (sdata) > + sta =3D sta_info_get_bss(sdata, skb_mac_header(sk= b)); > + > + if (ieee80211_is_data_qos(hdr->frame_control)) { > + qc =3D ieee80211_get_qos_ctl(hdr); > + tid =3D qc[0] & 0xf; > + ac =3D ieee80211_ac_from_tid(tid); > + } else { > + ac =3D IEEE80211_AC_BE; > + } > + > + ieee80211_sta_update_pending_airtime(local, sta, ac, > + info->tx_time_est <<= 2, > + true); > + rcu_read_unlock(); > + > + } > + > if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { > struct ieee80211_sub_if_data *sdata; > > @@ -930,6 +957,17 @@ static void __ieee80211_tx_status(struct ieee80211_h= w *hw, > tid =3D qc[0] & 0xf; > } > > + 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, > + ieee80211_ac= _from_tid(tid), > + info->tx_tim= e_est << 2, > + true); > + info->tx_time_est =3D 0; > + } > + > if (!acked && ieee80211_is_back_req(fc)) { > u16 control; > > diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c > index 12653d873b8c..b8ff56d1d661 100644 > --- a/net/mac80211/tx.c > +++ b/net/mac80211/tx.c > @@ -3542,6 +3542,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee802= 11_hw *hw, > > WARN_ON_ONCE(softirq_count() =3D=3D 0); > > + if (!ieee80211_txq_airtime_check(hw, txq)) > + return NULL; > + > begin: > spin_lock_bh(&fq->lock); > > @@ -3652,6 +3655,24 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80= 211_hw *hw, > } > > 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, t= xq->sta, > + skb->len); > + if (airtime) { > + /* We only have 10 bits in tx_time_est, so store = airtime > + * in increments of 4 us 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.st= a, > + txq->ac, air= time, > + false); > + } > + } > + > return skb; > > out: >