Commit 41d08583 authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg

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: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 0c2e3842
...@@ -301,7 +301,7 @@ minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, ...@@ -301,7 +301,7 @@ minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
break; break;
/* short preamble */ /* short preamble */
if (!(mi->groups[group].supported & BIT(idx))) if (!(mi->supported[group] & BIT(idx)))
idx += 4; idx += 4;
} }
return &mi->groups[group].rates[idx]; return &mi->groups[group].rates[idx];
...@@ -486,7 +486,7 @@ minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi) ...@@ -486,7 +486,7 @@ minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi)
MCS_GROUP_RATES].streams; MCS_GROUP_RATES].streams;
for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
mg = &mi->groups[group]; mg = &mi->groups[group];
if (!mg->supported || group == MINSTREL_CCK_GROUP) if (!mi->supported[group] || group == MINSTREL_CCK_GROUP)
continue; continue;
tmp_idx = mg->max_group_prob_rate % MCS_GROUP_RATES; tmp_idx = mg->max_group_prob_rate % MCS_GROUP_RATES;
...@@ -540,7 +540,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) ...@@ -540,7 +540,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
mg = &mi->groups[group]; mg = &mi->groups[group];
if (!mg->supported) if (!mi->supported[group])
continue; continue;
mi->sample_count++; mi->sample_count++;
...@@ -550,7 +550,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) ...@@ -550,7 +550,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
tmp_group_tp_rate[j] = group; tmp_group_tp_rate[j] = group;
for (i = 0; i < MCS_GROUP_RATES; i++) { for (i = 0; i < MCS_GROUP_RATES; i++) {
if (!(mg->supported & BIT(i))) if (!(mi->supported[group] & BIT(i)))
continue; continue;
index = MCS_GROUP_RATES * group + i; index = MCS_GROUP_RATES * group + i;
...@@ -636,7 +636,7 @@ minstrel_set_next_sample_idx(struct minstrel_ht_sta *mi) ...@@ -636,7 +636,7 @@ minstrel_set_next_sample_idx(struct minstrel_ht_sta *mi)
mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups); mi->sample_group %= ARRAY_SIZE(minstrel_mcs_groups);
mg = &mi->groups[mi->sample_group]; mg = &mi->groups[mi->sample_group];
if (!mg->supported) if (!mi->supported[mi->sample_group])
continue; continue;
if (++mg->index >= MCS_GROUP_RATES) { if (++mg->index >= MCS_GROUP_RATES) {
...@@ -657,7 +657,7 @@ minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary) ...@@ -657,7 +657,7 @@ minstrel_downgrade_rate(struct minstrel_ht_sta *mi, u16 *idx, bool primary)
while (group > 0) { while (group > 0) {
group--; group--;
if (!mi->groups[group].supported) if (!mi->supported[group])
continue; continue;
if (minstrel_mcs_groups[group].streams > if (minstrel_mcs_groups[group].streams >
...@@ -994,7 +994,7 @@ minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) ...@@ -994,7 +994,7 @@ minstrel_get_sample_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
sample_idx = sample_table[mg->column][mg->index]; sample_idx = sample_table[mg->column][mg->index];
minstrel_set_next_sample_idx(mi); minstrel_set_next_sample_idx(mi);
if (!(mg->supported & BIT(sample_idx))) if (!(mi->supported[sample_group] & BIT(sample_idx)))
return -1; return -1;
mrs = &mg->rates[sample_idx]; mrs = &mg->rates[sample_idx];
...@@ -1052,7 +1052,7 @@ static void ...@@ -1052,7 +1052,7 @@ static void
minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp, minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp,
struct minstrel_ht_sta *mi, bool val) 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) if (!supported || !mi->cck_supported_short)
return; return;
...@@ -1061,7 +1061,7 @@ minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp, ...@@ -1061,7 +1061,7 @@ minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp,
return; return;
supported ^= mi->cck_supported_short | (mi->cck_supported_short << 4); 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 static void
...@@ -1154,7 +1154,7 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, ...@@ -1154,7 +1154,7 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
mi->cck_supported_short |= BIT(i); 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 static void
...@@ -1224,7 +1224,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1224,7 +1224,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
u32 gflags = minstrel_mcs_groups[i].flags; u32 gflags = minstrel_mcs_groups[i].flags;
int bw, nss; int bw, nss;
mi->groups[i].supported = 0; mi->supported[i] = 0;
if (i == MINSTREL_CCK_GROUP) { if (i == MINSTREL_CCK_GROUP) {
minstrel_ht_update_cck(mp, mi, sband, sta); minstrel_ht_update_cck(mp, mi, sband, sta);
continue; continue;
...@@ -1256,8 +1256,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1256,8 +1256,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
if (use_vht && minstrel_vht_only) if (use_vht && minstrel_vht_only)
continue; continue;
#endif #endif
mi->groups[i].supported = mcs->rx_mask[nss - 1]; mi->supported[i] = mcs->rx_mask[nss - 1];
if (mi->groups[i].supported) if (mi->supported[i])
n_supported++; n_supported++;
continue; continue;
} }
...@@ -1283,10 +1283,10 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband, ...@@ -1283,10 +1283,10 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
else else
bw = BW_20; 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); vht_cap->vht_mcs.tx_mcs_map);
if (mi->groups[i].supported) if (mi->supported[i])
n_supported++; n_supported++;
} }
......
...@@ -52,9 +52,6 @@ struct minstrel_mcs_group_data { ...@@ -52,9 +52,6 @@ struct minstrel_mcs_group_data {
u8 index; u8 index;
u8 column; u8 column;
/* bitfield of supported MCS rates of this group */
u16 supported;
/* sorted rate set within a MCS group*/ /* sorted rate set within a MCS group*/
u16 max_group_tp_rate[MAX_THR_RATES]; u16 max_group_tp_rate[MAX_THR_RATES];
u16 max_group_prob_rate; u16 max_group_prob_rate;
...@@ -101,6 +98,9 @@ struct minstrel_ht_sta { ...@@ -101,6 +98,9 @@ struct minstrel_ht_sta {
u8 cck_supported; u8 cck_supported;
u8 cck_supported_short; u8 cck_supported_short;
/* Bitfield of supported MCS rates of all groups */
u16 supported[MINSTREL_GROUPS_NB];
/* MCS rate group info and statistics */ /* MCS rate group info and statistics */
struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB]; struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB];
}; };
......
...@@ -24,7 +24,7 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p) ...@@ -24,7 +24,7 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
char gimode = 'L'; char gimode = 'L';
u32 gflags; u32 gflags;
if (!mi->groups[i].supported) if (!mi->supported[i])
return p; return p;
mg = &minstrel_mcs_groups[i]; mg = &minstrel_mcs_groups[i];
...@@ -42,7 +42,7 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p) ...@@ -42,7 +42,7 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
static const int bitrates[4] = { 10, 20, 55, 110 }; static const int bitrates[4] = { 10, 20, 55, 110 };
int idx = i * MCS_GROUP_RATES + j; int idx = i * MCS_GROUP_RATES + j;
if (!(mi->groups[i].supported & BIT(j))) if (!(mi->supported[i] & BIT(j)))
continue; continue;
if (gflags & IEEE80211_TX_RC_MCS) { if (gflags & IEEE80211_TX_RC_MCS) {
...@@ -170,7 +170,7 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p) ...@@ -170,7 +170,7 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p)
char gimode = 'L'; char gimode = 'L';
u32 gflags; u32 gflags;
if (!mi->groups[i].supported) if (!mi->supported[i])
return p; return p;
mg = &minstrel_mcs_groups[i]; mg = &minstrel_mcs_groups[i];
...@@ -188,7 +188,7 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p) ...@@ -188,7 +188,7 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p)
static const int bitrates[4] = { 10, 20, 55, 110 }; static const int bitrates[4] = { 10, 20, 55, 110 };
int idx = i * MCS_GROUP_RATES + j; int idx = i * MCS_GROUP_RATES + j;
if (!(mi->groups[i].supported & BIT(j))) if (!(mi->supported[i] & BIT(j)))
continue; continue;
if (gflags & IEEE80211_TX_RC_MCS) { if (gflags & IEEE80211_TX_RC_MCS) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment