Received: by 2002:a05:6a10:2785:0:0:0:0 with SMTP id ia5csp313477pxb; Fri, 15 Jan 2021 04:06:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJwLIQqnRKQ7ML1ubHcCSlY+e68deULchOFZkkA4mqckGNjufqWvhxPrgkfGDdeIVHyozaCv X-Received: by 2002:a17:906:a115:: with SMTP id t21mr8470135ejy.549.1610712365491; Fri, 15 Jan 2021 04:06:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610712365; cv=none; d=google.com; s=arc-20160816; b=NbENIdSnqV3UGrEkqf+NUNzHff00tMxNumHnSBaQDnRKvj17BvpRcuJbR2aMLcHeqt 2FevSY6Gt0SACGGaLx59+rTsTkwFIlFfkYJ8tzYFlk1Gikl3vG/LaYv94ZYzwKM7DxPr 5xqSjejcznZCZwetIlk9p9xvjwyI/yp4sAVO2HbHj8H4K8lYkKxKEX25ldqlyZiTNDtZ nwuEUGkrLoT53VBxY5VMwm2xeRww4273ml5kQoATHz3C1WZd2Es1utrljUG1lNOqek2K rJVhhTWid1ihN7vMA3ddG6QHIlJKngLRgAbJYPOf6nYGElVHSbIf1tjy1ZzibbDQrhav t8GA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=l5LEBf9/QPDTcW8NuqvT3iOEvrcuezNN96oSvEZ9MCo=; b=RG+HOYnXslAEsY/BP1owtU0Zmd4ycL3XVw2UHR09MToyX8iLi+odweFyuqnS61s/Gc trqvI6JMqQrJ7T/tSPNtBYDaiqpX88N4S3MG+U+pxK9UGhIvL84S1cLSfIfrErMEOFyp mDCJTOwTMN7y9I2Ancd9fRtmGqddlGJNie3d8cJh9tT46K8CYu0R8ctpn/nKNRI4QmdQ YZLzod9BBdIMYqUjU5+MmEIHUITbC9J71VE04srGV4RCb6HOvK0EIKFcLtTCnx7JYw3j +QGwH5rf6IAXPkiRmW+qoT2Mu5CDblRzE2ablEzUnTJfvzfRyyXu0gEw+yjyiABQWx1b CsHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@nbd.name header.s=20160729 header.b=erfVIB5r; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hc7si196108ejc.223.2021.01.15.04.05.41; Fri, 15 Jan 2021 04:06:05 -0800 (PST) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@nbd.name header.s=20160729 header.b=erfVIB5r; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730567AbhAOMDp (ORCPT + 99 others); Fri, 15 Jan 2021 07:03:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60722 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728020AbhAOMDo (ORCPT ); Fri, 15 Jan 2021 07:03:44 -0500 Received: from nbd.name (nbd.name [IPv6:2a01:4f8:221:3d45::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77F86C0613D3 for ; Fri, 15 Jan 2021 04:02:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=nbd.name; s=20160729; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=l5LEBf9/QPDTcW8NuqvT3iOEvrcuezNN96oSvEZ9MCo=; b=erfVIB5rYVbOi/MVmXZzNtEUTo XrQ8IOPiQZY7B7TotM2kw4dLFEeno0AbiyOVT0yd93fZiUiYXJADE/o92F2UbI8eLaL/hoXLVnp9M HAU4zRg0Bq7Jw+mrrfDwMV0J5lFTfkfCoooqHg/QP4C/E9Z/0lnn/K10Nt6t70rVKIMQ=; Received: from p54ae91f2.dip0.t-ipconnect.de ([84.174.145.242] helo=localhost.localdomain) by ds12 with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.89) (envelope-from ) id 1l0NoU-0006Y0-TZ; Fri, 15 Jan 2021 13:02:47 +0100 From: Felix Fietkau To: linux-wireless@vger.kernel.org Cc: johannes@sipsolutions.net Subject: [PATCH v3 7/9] mac80211: minstrel_ht: fix max probability rate selection Date: Fri, 15 Jan 2021 13:02:40 +0100 Message-Id: <20210115120242.89616-8-nbd@nbd.name> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20210115120242.89616-1-nbd@nbd.name> References: <20210115120242.89616-1-nbd@nbd.name> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org - do not select rates faster than the max throughput rate if probability is lower - reset previous rate before sorting again This ensures that the max prob rate gets set to a more reliable rate Signed-off-by: Felix Fietkau --- net/mac80211/rc80211_minstrel_ht.c | 47 ++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c index 58f7400b78b2..d3bead4b5b04 100644 --- a/net/mac80211/rc80211_minstrel_ht.c +++ b/net/mac80211/rc80211_minstrel_ht.c @@ -495,12 +495,13 @@ minstrel_ht_sort_best_tp_rates(struct minstrel_ht_sta *mi, u16 index, * Find and set the topmost probability rate per sta and per group */ static void -minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 index) +minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 *dest, u16 index) { struct minstrel_mcs_group_data *mg; struct minstrel_rate_stats *mrs; int tmp_group, tmp_idx, tmp_tp_avg, tmp_prob; - int max_tp_group, cur_tp_avg, cur_group, cur_idx; + int max_tp_group, max_tp_idx, max_tp_prob; + int cur_tp_avg, cur_group, cur_idx; int max_gpr_group, max_gpr_idx; int max_gpr_tp_avg, max_gpr_prob; @@ -509,18 +510,26 @@ minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 index) mg = &mi->groups[index / MCS_GROUP_RATES]; mrs = &mg->rates[index % MCS_GROUP_RATES]; - tmp_group = mi->max_prob_rate / MCS_GROUP_RATES; - tmp_idx = mi->max_prob_rate % MCS_GROUP_RATES; + tmp_group = *dest / MCS_GROUP_RATES; + tmp_idx = *dest % MCS_GROUP_RATES; tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg; tmp_tp_avg = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob); /* if max_tp_rate[0] is from MCS_GROUP max_prob_rate get selected from * MCS_GROUP as well as CCK_GROUP rates do not allow aggregation */ max_tp_group = mi->max_tp_rate[0] / MCS_GROUP_RATES; + max_tp_idx = mi->max_tp_rate[0] % MCS_GROUP_RATES; + max_tp_prob = mi->groups[max_tp_group].rates[max_tp_idx].prob_avg; + if (minstrel_ht_is_legacy_group(index / MCS_GROUP_RATES) && !minstrel_ht_is_legacy_group(max_tp_group)) return; + /* skip rates faster than max tp rate with lower prob */ + if (minstrel_get_duration(mi->max_tp_rate[0]) > minstrel_get_duration(index) && + mrs->prob_avg < max_tp_prob) + return; + max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES; max_gpr_idx = mg->max_group_prob_rate % MCS_GROUP_RATES; max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_avg; @@ -538,7 +547,7 @@ minstrel_ht_set_best_prob_rate(struct minstrel_ht_sta *mi, u16 index) mg->max_group_prob_rate = index; } else { if (mrs->prob_avg > tmp_prob) - mi->max_prob_rate = index; + *dest = index; if (mrs->prob_avg > max_gpr_prob) mg->max_group_prob_rate = index; } @@ -816,7 +825,8 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, struct minstrel_rate_stats *mrs; int group, i, j, cur_prob; u16 tmp_mcs_tp_rate[MAX_THR_RATES], tmp_group_tp_rate[MAX_THR_RATES]; - u16 tmp_legacy_tp_rate[MAX_THR_RATES], index; + u16 tmp_legacy_tp_rate[MAX_THR_RATES], tmp_max_prob_rate; + u16 index; bool ht_supported = mi->sta->ht_cap.ht_supported; mi->sample_mode = MINSTREL_SAMPLE_IDLE; @@ -863,6 +873,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, else index = MINSTREL_OFDM_GROUP * MCS_GROUP_RATES; + tmp_max_prob_rate = index; for (j = 0; j < ARRAY_SIZE(tmp_mcs_tp_rate); j++) tmp_mcs_tp_rate[j] = index; @@ -903,9 +914,6 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, /* Find max throughput rate set within a group */ minstrel_ht_sort_best_tp_rates(mi, index, tmp_group_tp_rate); - - /* Find max probability rate per group and global */ - minstrel_ht_set_best_prob_rate(mi, index); } memcpy(mg->max_group_tp_rate, tmp_group_tp_rate, @@ -917,6 +925,27 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, tmp_legacy_tp_rate); memcpy(mi->max_tp_rate, tmp_mcs_tp_rate, sizeof(mi->max_tp_rate)); + for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { + if (!mi->supported[group]) + continue; + + mg = &mi->groups[group]; + mg->max_group_prob_rate = MCS_GROUP_RATES * group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { + if (!(mi->supported[group] & BIT(i))) + continue; + + index = MCS_GROUP_RATES * group + i; + + /* Find max probability rate per group and global */ + minstrel_ht_set_best_prob_rate(mi, &tmp_max_prob_rate, + index); + } + } + + mi->max_prob_rate = tmp_max_prob_rate; + /* Try to increase robustness of max_prob_rate*/ minstrel_ht_prob_rate_reduce_streams(mi); -- 2.28.0