From 00bc7f0357d082e73699fb561776088e48e53101 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 15 Dec 2016 11:48:12 +0100 Subject: mac80211: merge a number of minstrel/minstrel_ht performance and memory usage improvements Signed-off-by: Felix Fietkau --- ...nstrel_ht-move-supported-bitrate-mask-out.patch | 196 +++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 package/kernel/mac80211/patches/334-mac80211-minstrel_ht-move-supported-bitrate-mask-out.patch (limited to 'package/kernel/mac80211/patches/334-mac80211-minstrel_ht-move-supported-bitrate-mask-out.patch') diff --git a/package/kernel/mac80211/patches/334-mac80211-minstrel_ht-move-supported-bitrate-mask-out.patch b/package/kernel/mac80211/patches/334-mac80211-minstrel_ht-move-supported-bitrate-mask-out.patch new file mode 100644 index 0000000000..5e5992e6b4 --- /dev/null +++ b/package/kernel/mac80211/patches/334-mac80211-minstrel_ht-move-supported-bitrate-mask-out.patch @@ -0,0 +1,196 @@ +From: Felix Fietkau +Date: Wed, 14 Dec 2016 19:33:23 +0100 +Subject: [PATCH] mac80211: minstrel_ht: move supported bitrate mask out of + group data + +Improves dcache footprint by ensuring that fewer cache lines need to be +touched. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -301,7 +301,7 @@ minstrel_ht_get_stats(struct minstrel_pr + break; + + /* short preamble */ +- if (!(mi->groups[group].supported & BIT(idx))) ++ if (!(mi->supported[group] & BIT(idx))) + idx += 4; + } + return &mi->groups[group].rates[idx]; +@@ -486,7 +486,7 @@ minstrel_ht_prob_rate_reduce_streams(str + MCS_GROUP_RATES].streams; + for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { + mg = &mi->groups[group]; +- if (!mg->supported || group == MINSTREL_CCK_GROUP) ++ if (!mi->supported[group] || group == MINSTREL_CCK_GROUP) + continue; + + tmp_idx = mg->max_group_prob_rate % MCS_GROUP_RATES; +@@ -540,7 +540,7 @@ minstrel_ht_update_stats(struct minstrel + for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { + + mg = &mi->groups[group]; +- if (!mg->supported) ++ if (!mi->supported[group]) + continue; + + mi->sample_count++; +@@ -550,7 +550,7 @@ minstrel_ht_update_stats(struct minstrel + tmp_group_tp_rate[j] = group; + + for (i = 0; i < MCS_GROUP_RATES; i++) { +- if (!(mg->supported & BIT(i))) ++ if (!(mi->supported[group] & BIT(i))) + continue; + + index = MCS_GROUP_RATES * group + i; +@@ -636,7 +636,7 @@ minstrel_set_next_sample_idx(struct mins + mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups); + mg = &mi->groups[mi->sample_group]; + +- if (!mg->supported) ++ if (!mi->supported[mi->sample_group]) + continue; + + if (++mg->index >= MCS_GROUP_RATES) { +@@ -657,7 +657,7 @@ minstrel_downgrade_rate(struct minstrel_ + while (group > 0) { + group--; + +- if (!mi->groups[group].supported) ++ if (!mi->supported[group]) + continue; + + if (minstrel_mcs_groups[group].streams > +@@ -994,7 +994,7 @@ minstrel_get_sample_rate(struct minstrel + sample_idx = sample_table[mg->column][mg->index]; + minstrel_set_next_sample_idx(mi); + +- if (!(mg->supported & BIT(sample_idx))) ++ if (!(mi->supported[sample_group] & BIT(sample_idx))) + return -1; + + mrs = &mg->rates[sample_idx]; +@@ -1052,7 +1052,7 @@ static void + minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp, + struct minstrel_ht_sta *mi, bool val) + { +- u8 supported = mi->groups[MINSTREL_CCK_GROUP].supported; ++ u8 supported = mi->supported[MINSTREL_CCK_GROUP]; + + if (!supported || !mi->cck_supported_short) + return; +@@ -1061,7 +1061,7 @@ minstrel_ht_check_cck_shortpreamble(stru + return; + + supported ^= mi->cck_supported_short | (mi->cck_supported_short << 4); +- mi->groups[MINSTREL_CCK_GROUP].supported = supported; ++ mi->supported[MINSTREL_CCK_GROUP] = supported; + } + + static void +@@ -1154,7 +1154,7 @@ minstrel_ht_update_cck(struct minstrel_p + mi->cck_supported_short |= BIT(i); + } + +- mi->groups[MINSTREL_CCK_GROUP].supported = mi->cck_supported; ++ mi->supported[MINSTREL_CCK_GROUP] = mi->cck_supported; + } + + static void +@@ -1233,7 +1233,7 @@ minstrel_ht_update_caps(void *priv, stru + u32 gflags = minstrel_mcs_groups[i].flags; + int bw, nss; + +- mi->groups[i].supported = 0; ++ mi->supported[i] = 0; + if (i == MINSTREL_CCK_GROUP) { + minstrel_ht_update_cck(mp, mi, sband, sta); + continue; +@@ -1265,8 +1265,8 @@ minstrel_ht_update_caps(void *priv, stru + if (use_vht && minstrel_vht_only) + continue; + #endif +- mi->groups[i].supported = mcs->rx_mask[nss - 1]; +- if (mi->groups[i].supported) ++ mi->supported[i] = mcs->rx_mask[nss - 1]; ++ if (mi->supported[i]) + n_supported++; + continue; + } +@@ -1292,10 +1292,10 @@ minstrel_ht_update_caps(void *priv, stru + else + bw = BW_20; + +- mi->groups[i].supported = minstrel_get_valid_vht_rates(bw, nss, ++ mi->supported[i] = minstrel_get_valid_vht_rates(bw, nss, + vht_cap->vht_mcs.tx_mcs_map); + +- if (mi->groups[i].supported) ++ if (mi->supported[i]) + n_supported++; + } + +--- a/net/mac80211/rc80211_minstrel_ht.h ++++ b/net/mac80211/rc80211_minstrel_ht.h +@@ -52,9 +52,6 @@ struct minstrel_mcs_group_data { + u8 index; + u8 column; + +- /* bitfield of supported MCS rates of this group */ +- u16 supported; +- + /* sorted rate set within a MCS group*/ + u16 max_group_tp_rate[MAX_THR_RATES]; + u16 max_group_prob_rate; +@@ -101,6 +98,9 @@ struct minstrel_ht_sta { + u8 cck_supported; + u8 cck_supported_short; + ++ /* Bitfield of supported MCS rates of all groups */ ++ u16 supported[MINSTREL_GROUPS_NB]; ++ + /* MCS rate group info and statistics */ + struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB]; + }; +--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c ++++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c +@@ -24,7 +24,7 @@ minstrel_ht_stats_dump(struct minstrel_h + char gimode = 'L'; + u32 gflags; + +- if (!mi->groups[i].supported) ++ if (!mi->supported[i]) + return p; + + mg = &minstrel_mcs_groups[i]; +@@ -42,7 +42,7 @@ minstrel_ht_stats_dump(struct minstrel_h + static const int bitrates[4] = { 10, 20, 55, 110 }; + int idx = i * MCS_GROUP_RATES + j; + +- if (!(mi->groups[i].supported & BIT(j))) ++ if (!(mi->supported[i] & BIT(j))) + continue; + + if (gflags & IEEE80211_TX_RC_MCS) { +@@ -170,7 +170,7 @@ minstrel_ht_stats_csv_dump(struct minstr + char gimode = 'L'; + u32 gflags; + +- if (!mi->groups[i].supported) ++ if (!mi->supported[i]) + return p; + + mg = &minstrel_mcs_groups[i]; +@@ -188,7 +188,7 @@ minstrel_ht_stats_csv_dump(struct minstr + static const int bitrates[4] = { 10, 20, 55, 110 }; + int idx = i * MCS_GROUP_RATES + j; + +- if (!(mi->groups[i].supported & BIT(j))) ++ if (!(mi->supported[i] & BIT(j))) + continue; + + if (gflags & IEEE80211_TX_RC_MCS) { -- cgit v1.2.3