summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2012-09-17 01:09:17 +0000
committeradrian <adrian@FreeBSD.org>2012-09-17 01:09:17 +0000
commitaf98639e61803cde9832ca89cb95a14352a2c9f5 (patch)
tree8b6d1cb307d4ea9203c8f31a54ba6d869c329b97
parentfe4b371055877df55eb5a3bc5e5f105b4006675b (diff)
downloadFreeBSD-src-af98639e61803cde9832ca89cb95a14352a2c9f5.zip
FreeBSD-src-af98639e61803cde9832ca89cb95a14352a2c9f5.tar.gz
Improve performance of the Sample rate algorithm on 802.11n networks.
* Don't treat high percentage failures as "sucessive failures" - high MCS rates are very picky and will quite happily "fade" from low to high failure % and back again within a few seconds. If they really don't work, the aggregate will just plain fail. * Only sample MCS rates +/- 3 from the current MCS. Sample will back off quite quickly, so there's no need to sample _all_ MCS rates between a high MCS rate and MCS0; there may be a lot of them. * Modify the smoothing rate to be 75% rather than 95% - it's more adaptive but it comes with a cost of being slightly less stable at times. A per-node, hysterisis behaviour would be nicer.
-rw-r--r--sys/dev/ath/ath_rate/sample/sample.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/sys/dev/ath/ath_rate/sample/sample.c b/sys/dev/ath/ath_rate/sample/sample.c
index c023aa5..1ec9b53 100644
--- a/sys/dev/ath/ath_rate/sample/sample.c
+++ b/sys/dev/ath/ath_rate/sample/sample.c
@@ -293,27 +293,17 @@ pick_sample_rate(struct sample_softc *ssc , struct ath_node *an,
}
/*
- * When doing aggregation, successive failures don't happen
- * as often, as sometimes some of the sub-frames get through.
- *
- * If the sample rix average tx time is greater than the
- * average tx time of the current rix, don't immediately use
- * the rate for sampling.
+ * For HT, only sample a few rates on either side of the
+ * current rix; there's quite likely a lot of them.
*/
if (an->an_node.ni_flags & IEEE80211_NODE_HT) {
- if ((sn->stats[size_bin][rix].average_tx_time * 10 >
- sn->stats[size_bin][current_rix].average_tx_time * 9) &&
- (ticks - sn->stats[size_bin][rix].last_tx < ssc->stale_failure_timeout)) {
+ if (rix < (current_rix - 3) ||
+ rix > (current_rix + 3)) {
mask &= ~((uint64_t) 1<<rix);
goto nextrate;
}
}
- /*
- * XXX TODO
- * For HT, limit sample somehow?
- */
-
/* Don't sample more than 2 rates higher for rates > 11M for non-HT rates */
if (! (an->an_node.ni_flags & IEEE80211_NODE_HT)) {
if (DOT11RATE(rix) > 2*11 && rix > current_rix + 2) {
@@ -1420,7 +1410,7 @@ ath_rate_attach(struct ath_softc *sc)
if (ssc == NULL)
return NULL;
ssc->arc.arc_space = sizeof(struct sample_node);
- ssc->smoothing_rate = 95; /* ewma percentage ([0..99]) */
+ ssc->smoothing_rate = 75; /* ewma percentage ([0..99]) */
ssc->smoothing_minpackets = 100 / (100 - ssc->smoothing_rate);
ssc->sample_rate = 10; /* %time to try diff tx rates */
ssc->max_successive_failures = 3; /* threshold for rate sampling*/
OpenPOWER on IntegriCloud