aboutsummaryrefslogtreecommitdiffstats
path: root/patches
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-20 10:46:37 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-20 10:46:37 +0100
commit2e6d2d7144dad52e77f8fa64d598cc3d22eff1aa (patch)
tree40a9bbde2c27769283ecb1fb7efc10d849bf3f2d /patches
parentf7d2be903b7296434d1f1c69e9d9a6f2ac221e11 (diff)
downloadxen-2e6d2d7144dad52e77f8fa64d598cc3d22eff1aa.tar.gz
xen-2e6d2d7144dad52e77f8fa64d598cc3d22eff1aa.tar.bz2
xen-2e6d2d7144dad52e77f8fa64d598cc3d22eff1aa.zip
[NET] gso: Fix rcv mss estimate
I noticed that with default TCP window sizes TSO + Xen would slow to a crawl on certain machines. It turned out that there is a bug in the TCP stack when it comes to receiving LRO (counter part of TSO for rx) packets. The following fix has been applied upstream. [TCP]: Fix rcv mss estimate for LRO By passing a Linux-generated TSO packet straight back into Linux, Xen becomes our first LRO user :) Unfortunately, there is at least one spot in our stack that needs to be changed to cope with this. The receive MSS estimate is computed from the raw packet size. This is broken if the packet is GSO/LRO. Fortunately the real MSS can be found in gso_size so we simply need to use that if it is non-zero. Real LRO NICs should of course set the gso_size field in future. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'patches')
-rw-r--r--patches/linux-2.6.16.29/net-gso-5-rcv-mss.patch13
1 files changed, 13 insertions, 0 deletions
diff --git a/patches/linux-2.6.16.29/net-gso-5-rcv-mss.patch b/patches/linux-2.6.16.29/net-gso-5-rcv-mss.patch
new file mode 100644
index 0000000000..a711d0ee5f
--- /dev/null
+++ b/patches/linux-2.6.16.29/net-gso-5-rcv-mss.patch
@@ -0,0 +1,13 @@
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 104af5d..1fa1536 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -127,7 +127,7 @@ static void tcp_measure_rcv_mss(struct s
+ /* skb->len may jitter because of SACKs, even if peer
+ * sends good full-sized frames.
+ */
+- len = skb->len;
++ len = skb_shinfo(skb)->gso_size ?: skb->len;
+ if (len >= icsk->icsk_ack.rcv_mss) {
+ icsk->icsk_ack.rcv_mss = len;
+ } else {