From patchwork Mon Aug 13 23:13:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajkumar Manoharan X-Patchwork-Id: 10564947 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 F17A0139A for ; Mon, 13 Aug 2018 23:13:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E119429338 for ; Mon, 13 Aug 2018 23:13:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D37FB29342; Mon, 13 Aug 2018 23:13:48 +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 6802829338 for ; Mon, 13 Aug 2018 23:13:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732368AbeHNB6J (ORCPT ); Mon, 13 Aug 2018 21:58:09 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:51600 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730203AbeHNB6J (ORCPT ); Mon, 13 Aug 2018 21:58:09 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 0692160213; Mon, 13 Aug 2018 23:13:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202027; bh=k4LKDQ6CJz0oVOrfx6pIdIUiQ6sOctYKtMfbNAQ79QA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fGoWcDoaD2sFJPbDvevVR2WXGHsTTQWMd4Y8BMVJ6zlIg7GUBuszqwWcVPsjMzyEy BDmsxZnovl06NvSN7cVVI/qzzQJv7l998AFUvjItbDAKtThLes/Lw4potyQaLfnU26 gEjn7GqRnwQD7v5JJqrhf/TsYLjIWTULjh/JoJqE= 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 19E14604BE; Mon, 13 Aug 2018 23:13:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202026; bh=k4LKDQ6CJz0oVOrfx6pIdIUiQ6sOctYKtMfbNAQ79QA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=osVYuRLbgIEAEXl49WHDPYj9wxSE8lKZbYolM6g55mkD+7PvJmz74dpddTDyNxKUZ ziD+yKUbZgGkGsN7AIK/s4fzkJN6yEE8UN+EGUslxjo8+jlJ7xqEHHNhQaU+YWuFmT 5UiavRyzoKUFz0R6XTggiL887xX5ngOgV98/AAHE= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 19E14604BE 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); Mon, 13 Aug 2018 16:13:44 -0700 From: Rajkumar Manoharan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Rajkumar Manoharan Subject: [RFC 1/3] mac80211: make airtime txq list per ac Date: Mon, 13 Aug 2018 16:13:29 -0700 Message-Id: <1534202011-13101-2-git-send-email-rmanohar@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1534202011-13101-1-git-send-email-rmanohar@codeaurora.org> References: <1534202011-13101-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 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 | 33 +++++++++++++++++++++++---------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index bd7f074ccf16..5825824cfe5b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1129,7 +1129,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 airtime_flags; diff --git a/net/mac80211/main.c b/net/mac80211/main.c index fbb0bd6183d2..771366464f18 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; diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 8acab75a0700..6a76852ba1f3 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3597,9 +3597,11 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw, * call to ieee80211_next_txq(). */ if ((local->airtime_flags & AIRTIME_ACTIVE) && 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); + list_add_tail(&txqi->schedule_order, + &local->active_txqs[txq->ac]); ret = true; } @@ -3609,15 +3611,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) @@ -3628,7 +3641,7 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) spin_lock_bh(&local->active_txq_lock); begin: - txqi = find_txqi(&local->active_txqs, ac); + txqi = find_txqi(local, ac); if (!txqi) goto out; @@ -3639,7 +3652,7 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) if (sta->airtime.deficit[txqi->txq.ac] < 0) { sta->airtime.deficit[txqi->txq.ac] += IEEE80211_AIRTIME_QUANTUM * sta->airtime.weight; list_move_tail(&txqi->schedule_order, - &local->active_txqs); + &local->active_txqs[txqi->txq.ac]); goto begin; } } From patchwork Mon Aug 13 23:13:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajkumar Manoharan X-Patchwork-Id: 10564949 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 951AE139A for ; Mon, 13 Aug 2018 23:13:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 864A829338 for ; Mon, 13 Aug 2018 23:13:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7A62129342; Mon, 13 Aug 2018 23:13:51 +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 09D5429338 for ; Mon, 13 Aug 2018 23:13:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732488AbeHNB6M (ORCPT ); Mon, 13 Aug 2018 21:58:12 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:51656 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730203AbeHNB6M (ORCPT ); Mon, 13 Aug 2018 21:58:12 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 183F860B6B; Mon, 13 Aug 2018 23:13:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202029; bh=x1pF04e5hwGiP89pG5KDyDDtcpaLsnhrkezQe64Wc2Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LPh/VGzpj7r43uHEcYBFVo//XS3PfVVkA6QQDLtm6SHZ8z+MLMDiHwbZJKOKjMkfH RlCqzTEH3iCRYKcyPcbrsZn+WVgcKK+rbonhqcIrqk+4nDbI3LDCznYum5oxBUnp8W Cwa6D2Vv18/Ee5RImnzC8qBH9rNTRGeKj/5M1Pbs= 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 1DEC460791; Mon, 13 Aug 2018 23:13:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202028; bh=x1pF04e5hwGiP89pG5KDyDDtcpaLsnhrkezQe64Wc2Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FZqrMlqFZWxuIGylRFDz5czrHbJFUT/Tjwic7ZRw8KINwCM8HVfuqB1JyerL/H++S WzYr737Zbh7SRgR4qKDN9na4KcUKmYFcBMWnjUQu1M9sZYH4ujPiZZUladsCmX+xe/ bbjdC4lWsbZ/lA8ExGiJ8ZiBWtuGPi7HzB6Y8jTY= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 1DEC460791 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); Mon, 13 Aug 2018 16:13:46 -0700 From: Rajkumar Manoharan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Rajkumar Manoharan Subject: [RFC 2/3] mac80211: pause txq transmission on negative airtime deficit Date: Mon, 13 Aug 2018 16:13:30 -0700 Message-Id: <1534202011-13101-3-git-send-email-rmanohar@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1534202011-13101-1-git-send-email-rmanohar@codeaurora.org> References: <1534202011-13101-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 Airtime fairness prioritizes txqs and picks high priority txq. Once a txq is selected for transmission by next_txq(), dequeue routine is not preventing over downloading packets. i.e the driver is still allowed to dequeue frames from txq even when its fairness deficit goes negative. This is also causing inefficient fq-codel of mac80211 when the driver/firmware is maintaining another set of data queues. To address this problem, pause txq transmission when given txq's was already served for the assigned quantum and resume the transmission upon prioritization. Signed-off-by: Rajkumar Manoharan --- net/mac80211/debugfs_sta.c | 7 ++++--- net/mac80211/ieee80211_i.h | 1 + net/mac80211/sta_info.c | 9 +++++++++ net/mac80211/tx.c | 9 ++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index bae0fa7ff95a..5c38994cd95c 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 5825824cfe5b..3ef287075cb1 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 8af9e5c05ce4..215ae3a690aa 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -1830,6 +1830,8 @@ 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 fq *fq = &local->fq; + struct txq_info *txqi; u8 ac = ieee80211_ac_from_tid(tid); u32 airtime = 0; @@ -1844,6 +1846,13 @@ void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid, sta->airtime.deficit[ac] -= airtime; if (airtime) sta->local->airtime_flags |= AIRTIME_ACTIVE; + + if (sta->airtime.deficit[ac] < 0) { + txqi = to_txq_info(pubsta->txq[tid]); + spin_lock_bh(&fq->lock); + set_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); + spin_unlock_bh(&fq->lock); + } 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 6a76852ba1f3..0af35c08e0d9 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3475,7 +3475,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, spin_lock_bh(&fq->lock); - if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) + if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags) || + test_bit(IEEE80211_TXQ_PAUSE, &txqi->flags)) goto out; /* Make sure fragments stay together. */ @@ -3636,6 +3637,7 @@ static inline struct txq_info *find_txqi(struct ieee80211_local *local, s8 ac) struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) { struct ieee80211_local *local = hw_to_local(hw); + struct fq *fq = &local->fq; struct txq_info *txqi = NULL; spin_lock_bh(&local->active_txq_lock); @@ -3653,6 +3655,11 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) sta->airtime.deficit[txqi->txq.ac] += IEEE80211_AIRTIME_QUANTUM * sta->airtime.weight; list_move_tail(&txqi->schedule_order, &local->active_txqs[txqi->txq.ac]); + if (sta->airtime.deficit[txqi->txq.ac] > 0) { + spin_lock_bh(&fq->lock); + clear_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); + spin_unlock_bh(&fq->lock); + } goto begin; } } From patchwork Mon Aug 13 23:13:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rajkumar Manoharan X-Patchwork-Id: 10564951 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 57F23139A for ; Mon, 13 Aug 2018 23:13:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49F7629338 for ; Mon, 13 Aug 2018 23:13:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3E13E29342; Mon, 13 Aug 2018 23:13:53 +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 C5B4B29338 for ; Mon, 13 Aug 2018 23:13:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732491AbeHNB6N (ORCPT ); Mon, 13 Aug 2018 21:58:13 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:51690 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730203AbeHNB6N (ORCPT ); Mon, 13 Aug 2018 21:58:13 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id C5F6C607F7; Mon, 13 Aug 2018 23:13:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202030; bh=i0+HzWh5gOxF/54yA9eki77hrYJQ4jq8L5xReSNihik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fRimr/U/hjvMK7xRFyGOS6wb4oCSImY3WgWkIywJis8sBM7MH7jT68jCno+/DXTJP TAbezl7DwOQD1yqFxSQAd0R0uxw6kJ5u57bvhErF+PpXslHYYs9nyMThA6fOgNqj34 dbuKksPzKGTFxMV8jeuSrWyRGJPUeGA+3K9G7a4M= 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 2D19860769; Mon, 13 Aug 2018 23:13:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1534202030; bh=i0+HzWh5gOxF/54yA9eki77hrYJQ4jq8L5xReSNihik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fRimr/U/hjvMK7xRFyGOS6wb4oCSImY3WgWkIywJis8sBM7MH7jT68jCno+/DXTJP TAbezl7DwOQD1yqFxSQAd0R0uxw6kJ5u57bvhErF+PpXslHYYs9nyMThA6fOgNqj34 dbuKksPzKGTFxMV8jeuSrWyRGJPUeGA+3K9G7a4M= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 2D19860769 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); Mon, 13 Aug 2018 16:13:48 -0700 From: Rajkumar Manoharan To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Rajkumar Manoharan Subject: [RFC 3/3] mac80211: add ieee80211_reorder_txq Date: Mon, 13 Aug 2018 16:13:31 -0700 Message-Id: <1534202011-13101-4-git-send-email-rmanohar@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1534202011-13101-1-git-send-email-rmanohar@codeaurora.org> References: <1534202011-13101-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 This allows the driver to refill airtime fairness deficit where the driver will not access txqs by ieee80211_next_txq. In tx push mode data path, high priority txqs will be scheduled for data transmission by ieee80211_next_txq and driver will not prioritize txqs whereas in push-pull mode, the drivers can prioritize txqs and access them directly. In such mode, airtime deficit can not filled by ieee80211_next_txq. Signed-off-by: Rajkumar Manoharan --- include/net/mac80211.h | 15 +++++++++++++ net/mac80211/tx.c | 59 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index cc16847bd52d..a2f0b6800100 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -6033,6 +6033,21 @@ bool ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac); /** + * ieee80211_reorder_txq - change txq position in scheduling loop + * + * This function is used to reorder txq's position in scheduling loop. + * The txq fairness deficit will be refilled. The drivers calling this + * function should ensure the txq won't be accessed by ieee80211_next_txq + * in the same path. + * + * @hw: pointer as obtained from ieee80211_alloc_hw() + * @txq: pointer obtained from station or virtual interface + * + */ +void ieee80211_reorder_txq(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/tx.c b/net/mac80211/tx.c index 0af35c08e0d9..b7b2f93152f8 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3634,10 +3634,38 @@ static inline struct txq_info *find_txqi(struct ieee80211_local *local, s8 ac) return txqi; } +static bool ieee80211_txq_refill_deficit(struct ieee80211_local *local, + struct txq_info *txqi) +{ + struct fq *fq = &local->fq; + 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) + return false; + + sta->airtime.deficit[txqi->txq.ac] += + IEEE80211_AIRTIME_QUANTUM * sta->airtime.weight; + list_move_tail(&txqi->schedule_order, + &local->active_txqs[txqi->txq.ac]); + + if (sta->airtime.deficit[txqi->txq.ac] > 0) { + spin_lock_bh(&fq->lock); + clear_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); + spin_unlock_bh(&fq->lock); + } + return true; +} + struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) { struct ieee80211_local *local = hw_to_local(hw); - struct fq *fq = &local->fq; struct txq_info *txqi = NULL; spin_lock_bh(&local->active_txq_lock); @@ -3647,22 +3675,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] += IEEE80211_AIRTIME_QUANTUM * sta->airtime.weight; - list_move_tail(&txqi->schedule_order, - &local->active_txqs[txqi->txq.ac]); - if (sta->airtime.deficit[txqi->txq.ac] > 0) { - spin_lock_bh(&fq->lock); - clear_bit(IEEE80211_TXQ_PAUSE, &txqi->flags); - spin_unlock_bh(&fq->lock); - } - goto begin; - } - } + if (ieee80211_txq_refill_deficit(local, txqi)) + goto begin; list_del_init(&txqi->schedule_order); @@ -3676,6 +3690,17 @@ struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, s8 ac) } EXPORT_SYMBOL(ieee80211_next_txq); +void ieee80211_reorder_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq) +{ + struct ieee80211_local *local = hw_to_local(hw); + struct txq_info *txqi = to_txq_info(txq); + + spin_lock_bh(&local->active_txq_lock); + ieee80211_txq_refill_deficit(local, txqi); + spin_unlock_bh(&local->active_txq_lock); +} +EXPORT_SYMBOL(ieee80211_reorder_txq); + void __ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev, u32 info_flags)