From patchwork Wed Aug 29 00:46:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajkumar Manoharan X-Patchwork-Id: 10579399 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A122E920 for ; Wed, 29 Aug 2018 00:46:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 917F52AEC2 for ; Wed, 29 Aug 2018 00:46:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8F7232AED8; Wed, 29 Aug 2018 00:46:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 251682AEC2 for ; Wed, 29 Aug 2018 00:46:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727166AbeH2Ekv (ORCPT ); Wed, 29 Aug 2018 00:40:51 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:51424 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725882AbeH2Ekv (ORCPT ); Wed, 29 Aug 2018 00:40:51 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 0A87560452; Wed, 29 Aug 2018 00:46:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1535503598; bh=zxKEyCIC04TctxNRczy7LDt+YLXhizltSibo00SFItk=; h=From:To:Cc:Subject:Date:From; b=K9uxH+p/qAtEDxfs0FlClgvvD0jJKE5mvVgYXO8Cx72uOSic2T+RHUvmHy2Th0orr 3VkqJcrhXhTH1ujESbXPFBwkP+jpkg8oV1WOcMv+nv19O6X4t/Wg1hVmwSF+w0vNM5 NjGauD2qtNeqmn/+/qUP861Vzj4Mx8yhDV3WtLts= Received: from smtp.codeaurora.org (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: rmanohar@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 2DD1F601DA; Wed, 29 Aug 2018 00:46:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1535503597; bh=zxKEyCIC04TctxNRczy7LDt+YLXhizltSibo00SFItk=; h=From:To:Cc:Subject:Date:From; b=nchmZoxYSnn4WBJObYdbGFfrLKyKYW7qwEMKMwRaNy4d2CfOUISqdZXYirR4nmgvs U+wdkZXA8iv0vrV/HjV3rBM7FOjpuSQNyOB7bZ/aXs57qCUe/sud8DeqyPorN8DnNW ut6AmOhjv3tMLlJwB5OvL6bi383wAibBfHHUgq1k= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 2DD1F601DA Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=rmanohar@codeaurora.org Received: by smtp.codeaurora.org (sSMTP sendmail emulation); Tue, 28 Aug 2018 17:46:35 -0700 From: Rajkumar Manoharan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Rajkumar Manoharan Subject: [RFC v2 1/2] mac80211: make airtime txq list per ac Date: Tue, 28 Aug 2018 17:46:33 -0700 Message-Id: <1535503594-32051-1-git-send-email-rmanohar@codeaurora.org> X-Mailer: git-send-email 1.9.1 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP txqs of all access categories are maintained in single list and in uneven order. To fetch a specific AC's txq from the list, lookup might have to traverse the entire list in worst case. To speedup txq lookup, txq list are maintained per each AC. Signed-off-by: Rajkumar Manoharan --- net/mac80211/ieee80211_i.h | 2 +- net/mac80211/main.c | 3 ++- net/mac80211/tx.c | 32 ++++++++++++++++++++++---------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index c1f8b9f6128d..2fc7a86b75a5 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1130,7 +1130,7 @@ struct ieee80211_local { /* protects active_txqs and txqi->schedule_order */ spinlock_t active_txq_lock; - struct list_head active_txqs; + struct list_head active_txqs[IEEE80211_NUM_ACS]; u16 schedule_seqno; u16 airtime_flags; diff --git a/net/mac80211/main.c b/net/mac80211/main.c index e65c2abb2a54..43e097c0042b 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -634,7 +634,8 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len, spin_lock_init(&local->rx_path_lock); spin_lock_init(&local->queue_stop_reason_lock); - INIT_LIST_HEAD(&local->active_txqs); + for (i = 0; i < IEEE80211_NUM_ACS; i++) + INIT_LIST_HEAD(&local->active_txqs[i]); spin_lock_init(&local->active_txq_lock); local->airtime_flags = AIRTIME_USE_TX | AIRTIME_USE_RX; local->airtime_quantum = IEEE80211_DEFAULT_AIRTIME_QUANTUM; diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index bc24905fbd50..d41aa62ba332 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3600,10 +3600,11 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw, if (wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS) && txqi->txq.sta) - list_add(&txqi->schedule_order, &local->active_txqs); + list_add(&txqi->schedule_order, + &local->active_txqs[txq->ac]); else list_add_tail(&txqi->schedule_order, - &local->active_txqs); + &local->active_txqs[txq->ac]); if (reset_seqno) txqi->schedule_seqno = local->schedule_seqno - 1; @@ -3616,15 +3617,26 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw, } EXPORT_SYMBOL(ieee80211_schedule_txq); -static inline struct txq_info *find_txqi(struct list_head *head, s8 ac) +static inline struct txq_info *find_txqi(struct ieee80211_local *local, s8 ac) { - struct txq_info *txqi; + struct txq_info *txqi = NULL; + int i; - list_for_each_entry(txqi, head, schedule_order) { - if (ac < 0 || txqi->txq.ac == ac) - return txqi; + if (ac >= 0 && ac < IEEE80211_NUM_ACS) { + txqi = list_first_entry_or_null(&local->active_txqs[ac], + struct txq_info, + schedule_order); + } else { + for (i = 0; i < IEEE80211_NUM_ACS; i++) { + if (list_empty(&local->active_txqs[i])) + continue; + txqi = list_first_entry(&local->active_txqs[i], + struct txq_info, + schedule_order); + } } - return NULL; + + return txqi; } struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, @@ -3639,7 +3651,7 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, local->schedule_seqno++; begin: - txqi = find_txqi(&local->active_txqs, ac); + txqi = find_txqi(local, ac); if (!txqi) goto out; @@ -3651,7 +3663,7 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, sta->airtime.deficit[txqi->txq.ac] += local->airtime_quantum * sta->airtime.weight; list_move_tail(&txqi->schedule_order, - &local->active_txqs); + &local->active_txqs[txqi->txq.ac]); goto begin; } } From patchwork Wed Aug 29 00:46:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajkumar Manoharan X-Patchwork-Id: 10579401 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 89D5F920 for ; Wed, 29 Aug 2018 00:46:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 79B522AE22 for ; Wed, 29 Aug 2018 00:46:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 775DF2AE3E; Wed, 29 Aug 2018 00:46:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2ECC2AEA9 for ; Wed, 29 Aug 2018 00:46:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727229AbeH2Ekx (ORCPT ); Wed, 29 Aug 2018 00:40:53 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:51462 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725882AbeH2Ekx (ORCPT ); Wed, 29 Aug 2018 00:40:53 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id E55B660540; Wed, 29 Aug 2018 00:46:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1535503599; bh=2DdOMphTvWsnmrcqmxlHO64dOM1ihx7VY6+oLK/8kKo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gV/KrvDrGUiikTvERIY0rlfiCUBv0qDFwMsTRVKIGQ5K2q0ODOFUoqsQ1TmvIwpv2 H6gVo6VMBl+Gd8oASh18+YceRRkvRqsEPn+VrCvXISnwpwjOwY1+SgAwEUMPvJ164i m9Ussy8qolt1mFKeXoNKNhXo96xzURM3zsCUeX2Y= Received: from smtp.codeaurora.org (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: rmanohar@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 31F8B60241; Wed, 29 Aug 2018 00:46:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1535503599; bh=2DdOMphTvWsnmrcqmxlHO64dOM1ihx7VY6+oLK/8kKo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gV/KrvDrGUiikTvERIY0rlfiCUBv0qDFwMsTRVKIGQ5K2q0ODOFUoqsQ1TmvIwpv2 H6gVo6VMBl+Gd8oASh18+YceRRkvRqsEPn+VrCvXISnwpwjOwY1+SgAwEUMPvJ164i m9Ussy8qolt1mFKeXoNKNhXo96xzURM3zsCUeX2Y= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 31F8B60241 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=rmanohar@codeaurora.org Received: by smtp.codeaurora.org (sSMTP sendmail emulation); Tue, 28 Aug 2018 17:46:37 -0700 From: Rajkumar Manoharan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Rajkumar Manoharan Subject: [RFC v2 2/2] mac80211: manage txq transmission based on airtime deficit Date: Tue, 28 Aug 2018 17:46:34 -0700 Message-Id: <1535503594-32051-2-git-send-email-rmanohar@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1535503594-32051-1-git-send-email-rmanohar@codeaurora.org> References: <1535503594-32051-1-git-send-email-rmanohar@codeaurora.org> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Once a txq is selected for transmission by next_txq(), all data from txq are dequeued by driver till hardware descriptors are drained. i.e the driver is still allowed to dequeue frames from txq even when its fairness deficit goes negative during transmission. This breaks fairness and also cause inefficient fq-codel in mac80211 when data queues are maintained in driver/firmware. To address this problem, pause txq transmission immediately upon driver airtime report. This change also introduces an API (ieee80211_txq_can_transmit) that verifies that given txq is allowed for transmission. The drivers use this API while accessing txqs directly instead of next_txq(). Signed-off-by: Rajkumar Manoharan --- include/net/mac80211.h | 15 ++++++++++ net/mac80211/debugfs_sta.c | 7 +++-- net/mac80211/ieee80211_i.h | 1 + net/mac80211/sta_info.c | 7 +++++ net/mac80211/tx.c | 74 ++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 89 insertions(+), 15 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 17759d55b7d4..5d4709c57652 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -6049,6 +6049,21 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, bool inc_seqno); /** + * ieee80211_txq_can_transmit - check whether txq is paused due to deficit + * + * This function is used to check whether given txq is allowed for trasnmission + * or paused due to insufficient fairness deficit. Allows txq only if it is head + * node in scheduling loop and have sufficient deficit. Otherwise deficit is + * refilled and txq will be moved to tail of scheduling list. + * + * @hw: pointer as obtained from ieee80211_alloc_hw() + * @txq: pointer obtained from station or virtual interface + * + */ +bool ieee80211_txq_can_transmit(struct ieee80211_hw *hw, + struct ieee80211_txq *txq); + +/** * ieee80211_txq_get_depth - get pending frame/byte count of given txq * * The values are not guaranteed to be coherent with regard to each other, i.e. diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index de4067bc11cd..2d8c83bfd812 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c @@ -178,9 +178,10 @@ static ssize_t sta_aqm_read(struct file *file, char __user *userbuf, txqi->tin.tx_bytes, txqi->tin.tx_packets, txqi->flags, - txqi->flags & (1<flags & (1<flags & (1<flags & (1 << IEEE80211_TXQ_STOP) ? "STOP" : + txqi->flags & (1 << IEEE80211_TXQ_PAUSE) ? "PAUSE": "RUN", + txqi->flags & (1 << IEEE80211_TXQ_AMPDU) ? " AMPDU" : "", + txqi->flags & (1 << IEEE80211_TXQ_NO_AMSDU) ? " NO-AMSDU" : ""); } rcu_read_unlock(); diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 2fc7a86b75a5..fbddd55c9c1e 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -818,6 +818,7 @@ enum txq_info_flags { IEEE80211_TXQ_STOP, IEEE80211_TXQ_AMPDU, IEEE80211_TXQ_NO_AMSDU, + IEEE80211_TXQ_PAUSE, }; /** diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index f88f02df9e3a..c77c26b4aafa 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -1832,6 +1832,7 @@ 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 txq_info *txqi; u8 ac = ieee80211_ac_from_tid(tid); u32 airtime = 0; @@ -1844,6 +1845,12 @@ void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid, sta->airtime.tx_airtime += tx_airtime; sta->airtime.rx_airtime += rx_airtime; sta->airtime.deficit[ac] -= airtime; + + if (sta->airtime.deficit[ac] < 0) { + txqi = to_txq_info(pubsta->txq[tid]); + set_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); + list_add_tail(&txqi->schedule_order, &local->active_txqs[ac]); + } spin_unlock_bh(&local->active_txq_lock); } EXPORT_SYMBOL(ieee80211_sta_register_airtime); diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index d41aa62ba332..0a00b029da25 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -1438,6 +1438,7 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata, codel_stats_init(&txqi->cstats); __skb_queue_head_init(&txqi->frags); INIT_LIST_HEAD(&txqi->schedule_order); + txqi->flags = 0; txqi->txq.vif = &sdata->vif; @@ -1461,6 +1462,7 @@ void ieee80211_txq_purge(struct ieee80211_local *local, fq_tin_reset(fq, tin, fq_skb_free_func); ieee80211_purge_tx_queue(&local->hw, &txqi->frags); + txqi->flags = 0; spin_lock_bh(&local->active_txq_lock); list_del_init(&txqi->schedule_order); spin_unlock_bh(&local->active_txq_lock); @@ -3639,6 +3641,31 @@ static inline struct txq_info *find_txqi(struct ieee80211_local *local, s8 ac) return txqi; } +static bool ieee80211_txq_requeued(struct ieee80211_local *local, + struct txq_info *txqi) +{ + struct sta_info *sta; + + lockdep_assert_held(&local->active_txq_lock); + + if (!txqi->txq.sta) + return false; + + sta = container_of(txqi->txq.sta, struct sta_info, sta); + + if (sta->airtime.deficit[txqi->txq.ac] > 0) { + clear_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); + return false; + } + + sta->airtime.deficit[txqi->txq.ac] += + local->airtime_quantum * sta->airtime.weight; + list_move_tail(&txqi->schedule_order, + &local->active_txqs[txqi->txq.ac]); + + return true; +} + struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, bool inc_seqno) { @@ -3655,18 +3682,8 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, if (!txqi) goto out; - if (txqi->txq.sta) { - struct sta_info *sta = container_of(txqi->txq.sta, - struct sta_info, sta); - - if (sta->airtime.deficit[txqi->txq.ac] < 0) { - sta->airtime.deficit[txqi->txq.ac] += - local->airtime_quantum * sta->airtime.weight; - list_move_tail(&txqi->schedule_order, - &local->active_txqs[txqi->txq.ac]); - goto begin; - } - } + if (ieee80211_txq_requeued(local, txqi)) + goto begin; /* If seqnos are equal, we've seen this txqi before in this scheduling * round, so abort. @@ -3687,6 +3704,39 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac, } EXPORT_SYMBOL(ieee80211_next_txq); +bool ieee80211_txq_can_transmit(struct ieee80211_hw *hw, + struct ieee80211_txq *txq) +{ + struct ieee80211_local *local = hw_to_local(hw); + struct txq_info *txqi, *f_txqi; + bool can_tx; + + txqi = to_txq_info(txq); + /* Check whether txq is paused or not */ + if (test_bit(IEEE80211_TXQ_PAUSE, &txqi->flags)) + return false; + + can_tx = false; + spin_lock_bh(&local->active_txq_lock); + f_txqi = find_txqi(local, txq->ac); + if (!f_txqi) + goto out; + + /* Allow only head node to ensure fairness */ + if (f_txqi != txqi) + goto out; + + /* Check if txq is in negative deficit */ + if (!ieee80211_txq_requeued(local, txqi)) + can_tx = true; + + list_del_init(&txqi->schedule_order); +out: + spin_unlock_bh(&local->active_txq_lock); + return can_tx; +} +EXPORT_SYMBOL(ieee80211_txq_can_transmit); + void __ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev, u32 info_flags)