Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp6398569ybe; Wed, 18 Sep 2019 02:50:32 -0700 (PDT) X-Google-Smtp-Source: APXvYqyO2SSu3vD/p1JOzfPqT6VTijgiRwH7KNwkVALyrzxRRMvjuLLLD3OAZnVzO0lIXh9JYbuH X-Received: by 2002:a05:6402:1246:: with SMTP id l6mr9043500edw.213.1568800232456; Wed, 18 Sep 2019 02:50:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568800232; cv=none; d=google.com; s=arc-20160816; b=hbfIHSXH/ijkIJYDBMx5kI2TRQWwCqRCmNqIZKJoqH9vELIszwv8oB9tAwo7EkAUgp onOllOH8r92mBZXAXUDUZVvgswQbtvS26tNFFEfLtJjPUrTj3zcspY1KwiTmCuxyeFWi C4tVtgU0o4SLOZDRqr6a8IjF8t8U+QuqLy9sjfDRue+ZYd7gYvl7yqttzTUDItJ8rKu0 95ZodCPbXT/uoydf/kdaC4/EoB65VFbusz94dhRIPEvOme7g941O2++4crcUY8SsQISy 8eqM4O2gQVG3PjwuweQ3BNwzfxAs/X4xU51mO2Wfb4syKtVeAWWWIVu6Pt92CaH4vVA6 EQmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature; bh=UsS/qcCYlVuHaLcEgH3CQmlhrGQ22Sumzwd0tUctqg4=; b=jKycKR40JBfM3ZbYjKdvknmKfO++LXS1qWgIlsIRZ6EgaxhWliSO4Tbip/py15deLl eVQqWY1g/5ItfDSa+vJlZ+FIL0xLSlGXA7CCHGm3VjaSmDBsNXOjG077F6do8IgjfAe4 AOm+jRIQDbWkStmowzD9seihK/b1N9aTCKzvAunO4ec4gJJjsZKYaWvi8+dk5LYHMe8f uCT4te6qedXYwmWHndLGijpXP3tDrZQvFWKsRMYPw1kJZDw0L7cuJZwZ4WtdSNVBdHMd 4YVpMf3Da2hcGHK8Pj+XPPYbzGz+j0ExSwskPH0rrS1pLv8gn52/byUSMxDzFLsBpCRi UP8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=XagH7bk2; dkim=pass header.i=@codeaurora.org header.s=default header.b=GQWakng+; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d4si2416675ejk.327.2019.09.18.02.50.07; Wed, 18 Sep 2019 02:50:32 -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=@codeaurora.org header.s=default header.b=XagH7bk2; dkim=pass header.i=@codeaurora.org header.s=default header.b=GQWakng+; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727302AbfIRJri (ORCPT + 99 others); Wed, 18 Sep 2019 05:47:38 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:58958 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726961AbfIRJri (ORCPT ); Wed, 18 Sep 2019 05:47:38 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id B98A661573; Wed, 18 Sep 2019 09:47:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1568800056; bh=5JX1lmW17g+qL2td3nPo8cfxcZfFp8VfKyS13RecPRY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XagH7bk2TRI/rh1Phyvi2AUP7GHmLeWu1w8QVwXeVE4jl4+NpI3gEp4rDUsTLhKZW ghjNrukk9OXuwM/RVpuIhjnxlQv6Zl6+Fh2VzwwwW7Cqj6g1KK1TCpsqtqBti1Pcxe ISRvjLRsjgT/SNloST3ZjWOl8mo7rI9VAULu87oU= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED,SPF_NONE autolearn=no autolearn_force=no version=3.4.0 Received: from ybzhao-HP-Z230-SFF-Workstation.ap.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: yiboz@codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id C0BCF6155C; Wed, 18 Sep 2019 09:47:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1568800055; bh=5JX1lmW17g+qL2td3nPo8cfxcZfFp8VfKyS13RecPRY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GQWakng+ZnJoXt9IQBtU8JtQREK9c5gI5KNdcnqT9Pr6cYER7ak6EFiVxwi+jfZAk GuARZtSzmbCzPgTxJNURQJxOOh4nr44B9sSGoRsfHKRG36y6lf+Ecc6hhCzhJEF2Ys pxZYc5j8jQ1eVZhP2epcVWpUI7dRlId6WF8izSfI= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org C0BCF6155C 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=yiboz@codeaurora.org From: Yibo Zhao To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, Yibo Zhao Subject: [PATCH V2 4/4] mac80211: Sync airtime weight sum with per AC synced sta airtime weight together Date: Wed, 18 Sep 2019 17:47:13 +0800 Message-Id: <1568800033-17297-4-git-send-email-yiboz@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1568800033-17297-1-git-send-email-yiboz@codeaurora.org> References: <1568800033-17297-1-git-send-email-yiboz@codeaurora.org> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Global airtime weight sum is updated only when txq is added/removed from rbtree. If upper layer configures sta weight during high load, airtime weight sum will not be updated since txq is most likely on the tree. It could a little late for upper layer to reconfigure sta weight when txq is already in the rbtree. And thus, incorrect airtime weight sum will lead to incorrect global virtual time calculation as well as overflow of airtime weight sum during txq removed. Hence, need to update airtime weight sum upon receiving event for configuring sta weight once sta's txq is on the rbtree. Besides, if airtime weight sum of ACs and sta weight is synced under the same per AC lock protection, there can be a very short window causing incorrct airtime weight sum calculation as below: active_txq_lock_VO . VO weight sum is syncd . sta airtime weight sum is synced . active_txq_unlock_VO . . . active_txq_lock_VI . VI weight sum is syncd . sta airtime weight sum active_txq_lock_BE active_txq_unlock_VI Remove txq and thus sum . is calculated with synced . sta airtime weight . active_txq_unlock_BE So introduce a per ac synced station airtime weight synced with per AC synced weight sum together. And the per-AC station airtime weight is used to calculate weight sum. Signed-off-by: Yibo Zhao --- net/mac80211/cfg.c | 27 +++++++++++++++++++++++++-- net/mac80211/sta_info.c | 6 ++++-- net/mac80211/sta_info.h | 3 +++ net/mac80211/tx.c | 4 ++-- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index d65aa01..4b420bb 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1284,7 +1284,8 @@ static int sta_apply_parameters(struct ieee80211_local *local, int ret = 0; struct ieee80211_supported_band *sband; struct ieee80211_sub_if_data *sdata = sta->sdata; - u32 mask, set; + u32 mask, set, tid, ac; + struct txq_info *txqi; sband = ieee80211_get_sband(sdata); if (!sband) @@ -1452,8 +1453,30 @@ static int sta_apply_parameters(struct ieee80211_local *local, if (ieee80211_vif_is_mesh(&sdata->vif)) sta_apply_mesh_params(local, sta, params); - if (params->airtime_weight) + if (params->airtime_weight && + params->airtime_weight != sta->airtime_weight) { + for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { + spin_lock_bh(&local->active_txq_lock[ac]); + for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { + if (!sta->sta.txq[tid] || + ac != ieee80211_ac_from_tid(tid)) + continue; + + sta->airtime_weight_synced[ac] = + params->airtime_weight; + + txqi = to_txq_info(sta->sta.txq[tid]); + if (RB_EMPTY_NODE(&txqi->schedule_order)) + continue; + + local->airtime_weight_sum[ac] = local->airtime_weight_sum[ac] + + params->airtime_weight - + sta->airtime_weight; + } + spin_unlock_bh(&local->active_txq_lock[ac]); + } sta->airtime_weight = params->airtime_weight; + } /* set the STA state after all sta info from usermode has been set */ if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) || diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index feac975..b00812f 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -389,6 +389,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, for (i = 0; i < IEEE80211_NUM_ACS; i++) { skb_queue_head_init(&sta->ps_tx_buf[i]); skb_queue_head_init(&sta->tx_filtered[i]); + sta->airtime_weight_synced[i] = sta->airtime_weight; } for (i = 0; i < IEEE80211_NUM_TIDS; i++) @@ -1850,11 +1851,12 @@ void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid, sta->airtime[ac].tx_airtime += tx_airtime; sta->airtime[ac].rx_airtime += rx_airtime; - weight_sum = local->airtime_weight_sum[ac] ?: sta->airtime_weight; + weight_sum = local->airtime_weight_sum[ac] ? + : sta->airtime_weight_synced[ac]; /* Round the calculation of global vt */ local->airtime_v_t[ac] += (airtime + (weight_sum >> 1)) / weight_sum; - sta->airtime[ac].v_t += airtime / sta->airtime_weight; + sta->airtime[ac].v_t += airtime / sta->airtime_weight_synced[ac]; ieee80211_resort_txq(&local->hw, txq); spin_unlock_bh(&local->active_txq_lock[ac]); diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 5055f94..1298902 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -476,6 +476,8 @@ struct ieee80211_sta_rx_stats { * @tid_seq: per-TID sequence numbers for sending to this STA * @airtime: per-AC struct airtime_info describing airtime statistics for this * station + * @airtime_weight_synced: station per-AC airtime weight for sync and + * calculation * @airtime_weight: station weight for airtime fairness calculation purposes * @ampdu_mlme: A-MPDU state machine state * @mesh: mesh STA information @@ -602,6 +604,7 @@ struct sta_info { u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; struct airtime_info airtime[IEEE80211_NUM_ACS]; + u16 airtime_weight_synced[IEEE80211_NUM_ACS]; u16 airtime_weight; /* diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 60cf569..3592d49 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3735,7 +3735,7 @@ void ieee80211_schedule_txq(struct ieee80211_hw *hw, struct sta_info *sta = container_of(txq->sta, struct sta_info, sta); - local->airtime_weight_sum[ac] += sta->airtime_weight; + local->airtime_weight_sum[ac] += sta->airtime_weight_synced[ac]; if (local->airtime_v_t[ac] > AIRTIME_GRACE) sta->airtime[ac].v_t = max(local->airtime_v_t[ac] - AIRTIME_GRACE, sta->airtime[ac].v_t); @@ -3779,7 +3779,7 @@ static void __ieee80211_unschedule_txq(struct ieee80211_hw *hw, struct sta_info *sta = container_of(txq->sta, struct sta_info, sta); - local->airtime_weight_sum[ac] -= sta->airtime_weight; + local->airtime_weight_sum[ac] -= sta->airtime_weight_synced[ac]; } rb_erase_cached(&txqi->schedule_order, -- 1.9.1