add tcp bugfix causing high CPU load

[ bug introduced in 2.6.32-rc1 ]

svn path=/dists/sid/linux-2.6/; revision=15277
This commit is contained in:
Maximilian Attems 2010-02-25 12:11:13 +00:00
parent 301d7ad762
commit 8de617f5f7
3 changed files with 58 additions and 0 deletions

6
debian/changelog vendored
View File

@ -1,3 +1,9 @@
linux-2.6 (2.6.32-10) UNRELEASED; urgency=low
* tcp: fix ICMP-RTO war.
-- maximilian attems <maks@debian.org> Thu, 25 Feb 2010 13:07:47 +0100
linux-2.6 (2.6.32-9) unstable; urgency=high
[ Ben Hutchings ]

View File

@ -0,0 +1,51 @@
From 598856407d4e20ebb4de01a91a93d89325924d43 Mon Sep 17 00:00:00 2001
From: Damian Lukowski <damian@tvk.rwth-aachen.de>
Date: Wed, 10 Feb 2010 18:04:08 -0800
Subject: [PATCH] tcp: fix ICMP-RTO war
Make sure, that TCP has a nonzero RTT estimation after three-way
handshake. Currently, a listening TCP has a value of 0 for srtt,
rttvar and rto right after the three-way handshake is completed
with TCP timestamps disabled.
This will lead to corrupt RTO recalculation and retransmission
flood when RTO is recalculated on backoff reversion as introduced
in "Revert RTO on ICMP destination unreachable"
(f1ecd5d9e7366609d640ff4040304ea197fbc618).
This behaviour can be provoked by connecting to a server which
"responds first" (like SMTP) and rejecting every packet after
the handshake with dest-unreachable, which will lead to softirq
load on the server (up to 30% per socket in some tests).
Thanks to Ilpo Jarvinen for providing debug patches and to
Denys Fedoryshchenko for reporting and testing.
Changes since v3: Removed bad characters in patchfile.
Reported-by: Denys Fedoryshchenko <denys@visp.net.lb>
Signed-off-by: Damian Lukowski <damian@tvk.rwth-aachen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv4/tcp_input.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 28e0296..3fddc69 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5783,11 +5783,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
/* tcp_ack considers this ACK as duplicate
* and does not calculate rtt.
- * Fix it at least with timestamps.
+ * Force it here.
*/
- if (tp->rx_opt.saw_tstamp &&
- tp->rx_opt.rcv_tsecr && !tp->srtt)
- tcp_ack_saw_tstamp(sk, 0);
+ tcp_ack_update_rtt(sk, 0, 0);
if (tp->rx_opt.tstamp_ok)
tp->advmss -= TCPOLEN_TSTAMP_ALIGNED;
--
1.6.6.1

1
debian/patches/series/10 vendored Normal file
View File

@ -0,0 +1 @@
+ bugfix/all/tcp-fix-ICMP-RTO-war.patch