222 lines
7.7 KiB
Diff
222 lines
7.7 KiB
Diff
This reverts commit 484a54c2e597dbc4ace79c1687022282905afba0. The CoDel
|
|
parameter change essentially disables CoDel on slow stations, with some
|
|
questionable assumptions, as Dave pointed out in [0]. Quoting from
|
|
there:
|
|
|
|
But here are my pithy comments as to why this part of mac80211 is so
|
|
wrong...
|
|
|
|
static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
|
{
|
|
- if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
|
|
|
|
1) sta->local->num_sta is the number of associated, rather than
|
|
active, stations. "Active" stations in the last 50ms or so, might have
|
|
been a better thing to use, but as most people have far more than that
|
|
associated, we end up with really lousy codel parameters, all the
|
|
time. Mistake numero uno!
|
|
|
|
2) The STA_SLOW_THRESHOLD was completely arbitrary in 2016.
|
|
|
|
- sta->cparams.target = MS2TIME(50);
|
|
|
|
This, by itself, was probably not too bad. 30ms might have been
|
|
better, at the time, when we were battling powersave etc, but 20ms was
|
|
enough, really, to cover most scenarios, even where we had low rate
|
|
2Ghz multicast to cope with. Even then, codel has a hard time finding
|
|
any sane drop rate at all, with a target this high.
|
|
|
|
- sta->cparams.interval = MS2TIME(300);
|
|
|
|
But this was horrible, a total mistake, that is leading to codel being
|
|
completely ineffective in almost any scenario on clients or APS.
|
|
100ms, even 80ms, here, would be vastly better than this insanity. I'm
|
|
seeing 5+seconds of delay accumulated in a bunch of otherwise happily
|
|
fq-ing APs....
|
|
|
|
100ms of observed jitter during a flow is enough. Certainly (in 2016)
|
|
there were interactions with powersave that I did not understand, and
|
|
still don't, but if you are transmitting in the first place, powersave
|
|
shouldn't be a problemmmm.....
|
|
|
|
- sta->cparams.ecn = false;
|
|
|
|
At the time we were pretty nervous about ecn, I'm kind of sanguine
|
|
about it now, and reliably indicating ecn seems better than turning it
|
|
off for any reason.
|
|
|
|
[...]
|
|
|
|
In production, on p2p wireless, I've had 8ms and 80ms for target and
|
|
interval for years now, and it works great.
|
|
|
|
I think Dave's arguments above are basically sound on the face of it,
|
|
and various experimentation with tighter CoDel parameters in the OpenWrt
|
|
community have show promising results[1]. So I don't think there's any
|
|
reason to keep this parameter fiddling; hence this revert.
|
|
|
|
[0] https://lore.kernel.org/linux-wireless/CAA93jw6NJ2cmLmMauz0xAgC2MGbBq6n0ZiZzAdkK0u4b+O2yXg@mail.gmail.com/
|
|
[1] https://forum.openwrt.org/t/reducing-multiplexing-latencies-still-further-in-wifi/133605/130
|
|
|
|
Suggested-By: Dave Taht <dave.taht@gmail.com>
|
|
In-memory-of: Dave Taht <dave.taht@gmail.com>
|
|
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
|
|
|
|
--- a/include/net/mac80211.h
|
|
+++ b/include/net/mac80211.h
|
|
@@ -5347,22 +5347,6 @@ void ieee80211_get_tx_rates(struct ieee8
|
|
int max_rates);
|
|
|
|
/**
|
|
- * ieee80211_sta_set_expected_throughput - set the expected tpt for a station
|
|
- *
|
|
- * Call this function to notify mac80211 about a change in expected throughput
|
|
- * to a station. A driver for a device that does rate control in firmware can
|
|
- * call this function when the expected throughput estimate towards a station
|
|
- * changes. The information is used to tune the CoDel AQM applied to traffic
|
|
- * going towards that station (which can otherwise be too aggressive and cause
|
|
- * slow stations to starve).
|
|
- *
|
|
- * @pubsta: the station to set throughput for.
|
|
- * @thr: the current expected throughput in kbps.
|
|
- */
|
|
-void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta,
|
|
- u32 thr);
|
|
-
|
|
-/**
|
|
* ieee80211_tx_rate_update - transmit rate update callback
|
|
*
|
|
* Drivers should call this functions with a non-NULL pub sta
|
|
--- a/net/mac80211/debugfs_sta.c
|
|
+++ b/net/mac80211/debugfs_sta.c
|
|
@@ -152,12 +152,6 @@ static ssize_t sta_aqm_read(struct file
|
|
|
|
p += scnprintf(p,
|
|
bufsz + buf - p,
|
|
- "target %uus interval %uus ecn %s\n",
|
|
- codel_time_to_us(sta->cparams.target),
|
|
- codel_time_to_us(sta->cparams.interval),
|
|
- sta->cparams.ecn ? "yes" : "no");
|
|
- p += scnprintf(p,
|
|
- bufsz + buf - p,
|
|
"tid ac backlog-bytes backlog-packets new-flows drops marks overlimit collisions tx-bytes tx-packets flags\n");
|
|
|
|
for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
|
--- a/net/mac80211/rate.c
|
|
+++ b/net/mac80211/rate.c
|
|
@@ -990,8 +990,6 @@ int rate_control_set_rates(struct ieee80
|
|
if (sta->uploaded)
|
|
drv_sta_rate_tbl_update(hw_to_local(hw), sta->sdata, pubsta);
|
|
|
|
- ieee80211_sta_set_expected_throughput(pubsta, sta_get_expected_throughput(sta));
|
|
-
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(rate_control_set_rates);
|
|
--- a/net/mac80211/sta_info.c
|
|
+++ b/net/mac80211/sta_info.c
|
|
@@ -18,7 +18,6 @@
|
|
#include <linux/timer.h>
|
|
#include <linux/rtnetlink.h>
|
|
|
|
-#include <net/codel.h>
|
|
#include <net/mac80211.h>
|
|
#include "ieee80211_i.h"
|
|
#include "driver-ops.h"
|
|
@@ -702,13 +701,6 @@ __sta_info_alloc(struct ieee80211_sub_if
|
|
}
|
|
}
|
|
|
|
- sta->cparams.ce_threshold = CODEL_DISABLED_THRESHOLD;
|
|
- sta->cparams.target = MS2TIME(20);
|
|
- sta->cparams.interval = MS2TIME(100);
|
|
- sta->cparams.ecn = true;
|
|
- sta->cparams.ce_threshold_selector = 0;
|
|
- sta->cparams.ce_threshold_mask = 0;
|
|
-
|
|
sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
|
|
|
|
return sta;
|
|
@@ -2928,27 +2920,6 @@ unsigned long ieee80211_sta_last_active(
|
|
return sta->deflink.status_stats.last_ack;
|
|
}
|
|
|
|
-static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
|
-{
|
|
- if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
|
|
- sta->cparams.target = MS2TIME(50);
|
|
- sta->cparams.interval = MS2TIME(300);
|
|
- sta->cparams.ecn = false;
|
|
- } else {
|
|
- sta->cparams.target = MS2TIME(20);
|
|
- sta->cparams.interval = MS2TIME(100);
|
|
- sta->cparams.ecn = true;
|
|
- }
|
|
-}
|
|
-
|
|
-void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta,
|
|
- u32 thr)
|
|
-{
|
|
- struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
|
-
|
|
- sta_update_codel_params(sta, thr);
|
|
-}
|
|
-
|
|
int ieee80211_sta_allocate_link(struct sta_info *sta, unsigned int link_id)
|
|
{
|
|
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
|
--- a/net/mac80211/sta_info.h
|
|
+++ b/net/mac80211/sta_info.h
|
|
@@ -467,14 +467,6 @@ struct ieee80211_fragment_cache {
|
|
unsigned int next;
|
|
};
|
|
|
|
-/*
|
|
- * The bandwidth threshold below which the per-station CoDel parameters will be
|
|
- * scaled to be more lenient (to prevent starvation of slow stations). This
|
|
- * value will be scaled by the number of active stations when it is being
|
|
- * applied.
|
|
- */
|
|
-#define STA_SLOW_THRESHOLD 6000 /* 6 Mbps */
|
|
-
|
|
/**
|
|
* struct link_sta_info - Link STA information
|
|
* All link specific sta info are stored here for reference. This can be
|
|
@@ -627,7 +619,6 @@ struct link_sta_info {
|
|
* @sta: station information we share with the driver
|
|
* @sta_state: duplicates information about station state (for debug)
|
|
* @rcu_head: RCU head used for freeing this station struct
|
|
- * @cparams: CoDel parameters for this station.
|
|
* @reserved_tid: reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED)
|
|
* @amsdu_mesh_control: track the mesh A-MSDU format used by the peer:
|
|
*
|
|
@@ -718,8 +709,6 @@ struct sta_info {
|
|
struct dentry *debugfs_dir;
|
|
#endif
|
|
|
|
- struct codel_params cparams;
|
|
-
|
|
u8 reserved_tid;
|
|
s8 amsdu_mesh_control;
|
|
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -1402,16 +1402,9 @@ static struct sk_buff *fq_tin_dequeue_fu
|
|
|
|
local = container_of(fq, struct ieee80211_local, fq);
|
|
txqi = container_of(tin, struct txq_info, tin);
|
|
+ cparams = &local->cparams;
|
|
cstats = &txqi->cstats;
|
|
|
|
- if (txqi->txq.sta) {
|
|
- struct sta_info *sta = container_of(txqi->txq.sta,
|
|
- struct sta_info, sta);
|
|
- cparams = &sta->cparams;
|
|
- } else {
|
|
- cparams = &local->cparams;
|
|
- }
|
|
-
|
|
if (flow == &tin->default_flow)
|
|
cvars = &txqi->def_cvars;
|
|
else
|