diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-10-10 11:54:27 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-10-10 11:54:27 +0000 |
commit | f933719138c9402de7b6c0084e2f1fec3a06d803 (patch) | |
tree | cef94d09a71d44b4ade8b692789366248157bc55 | |
parent | 85871f283a2a0af3020684eaf7b28ff43d35fce8 (diff) | |
download | upstream-f933719138c9402de7b6c0084e2f1fec3a06d803.tar.gz upstream-f933719138c9402de7b6c0084e2f1fec3a06d803.tar.bz2 upstream-f933719138c9402de7b6c0084e2f1fec3a06d803.zip |
kernel: dont delay acks after ECN CE
Bugfix from linux head - don't delay acks from ECN congestion
experienced in some situations.
SVN-Revision: 33686
-rw-r--r-- | target/linux/generic/patches-3.3/060-tcp-ecn-dont-delay-ACKS-after-CE.patch | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.3/060-tcp-ecn-dont-delay-ACKS-after-CE.patch b/target/linux/generic/patches-3.3/060-tcp-ecn-dont-delay-ACKS-after-CE.patch new file mode 100644 index 0000000000..547e4faf73 --- /dev/null +++ b/target/linux/generic/patches-3.3/060-tcp-ecn-dont-delay-ACKS-after-CE.patch @@ -0,0 +1,63 @@ +From patchwork Mon Aug 6 21:04:43 2012 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [net-next] tcp: ecn: dont delay ACKS after CE +Date: Mon, 06 Aug 2012 11:04:43 -0000 +From: Eric Dumazet <eric.dumazet@gmail.com> +X-Patchwork-Id: 175453 +Message-Id: <1344287083.26674.83.camel@edumazet-glaptop> +To: David Miller <davem@davemloft.net> +Cc: netdev <netdev@vger.kernel.org>, + Neal Cardwell <ncardwell@google.com> + +From: Eric Dumazet <edumazet@google.com> + +While playing with CoDel and ECN marking, I discovered a +non optimal behavior of receiver of CE (Congestion Encountered) +segments. + +In pathological cases, sender has reduced its cwnd to low values, +and receiver delays its ACK (by 40 ms). + +While RFC 3168 6.1.3 (The TCP Receiver) doesn't explicitly recommend +to send immediate ACKS, we believe its better to not delay ACKS, because +a CE segment should give same signal than a dropped segment, and its +quite important to reduce RTT to give ECE/CWR signals as fast as +possible. + +Note we already call tcp_enter_quickack_mode() from TCP_ECN_check_ce() +if we receive a retransmit, for the same reason. + +Signed-off-by: Eric Dumazet <edumazet@google.com> +Cc: Neal Cardwell <ncardwell@google.com> +Acked-by: Neal Cardwell <ncardwell@google.com> + +--- +net/ipv4/tcp_input.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + + + +-- +To unsubscribe from this list: send the line "unsubscribe netdev" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 2fd2bc9..fa2c2c2 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -237,7 +237,11 @@ static inline void TCP_ECN_check_ce(struct tcp_sock *tp, const struct sk_buff *s + tcp_enter_quickack_mode((struct sock *)tp); + break; + case INET_ECN_CE: +- tp->ecn_flags |= TCP_ECN_DEMAND_CWR; ++ if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) { ++ /* Better not delay acks, sender can have a very low cwnd */ ++ tcp_enter_quickack_mode((struct sock *)tp); ++ tp->ecn_flags |= TCP_ECN_DEMAND_CWR; ++ } + /* fallinto */ + default: + tp->ecn_flags |= TCP_ECN_SEEN; |