As a followup I've put the following into my tree after discussing
some things with Stephen. He will do some of his tests to make
sure this fixes things as it should.
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2004/06/10 21:53:15-07:00 davem@xxxxxxxxxxxxxxxxxx
# [TCP]: Receive buffer moderation fixes.
#
# 1) Make window clamp follow receive buffer growth so it
# does not limit window advertisements. Noticed by John
# Heffner and Stephen Hemminger.
# 2) Fix rcvmem calculation such that tcp_adv_win_scale is
# taken into account.
#
# net/ipv4/tcp_input.c
# 2004/06/10 21:52:43-07:00 davem@xxxxxxxxxxxxxxxxxx +9 -1
# [TCP]: Receive buffer moderation fixes.
#
# 1) Make window clamp follow receive buffer growth so it
# does not limit window advertisements. Noticed by John
# Heffner and Stephen Hemminger.
#
# 2) Fix rcvmem calculation such that tcp_adv_win_scale is
# taken into account.
#
diff -Nru a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
--- a/net/ipv4/tcp_input.c 2004-06-10 21:55:14 -07:00
+++ b/net/ipv4/tcp_input.c 2004-06-10 21:55:14 -07:00
@@ -463,6 +463,8 @@
tp->rcvq_space.space = space;
if (sysctl_tcp_moderate_rcvbuf) {
+ int new_clamp = space;
+
/* Receive space grows, normalize in order to
* take into account packet headers and sk_buff
* structure overhead.
@@ -472,10 +474,16 @@
space = 1;
rcvmem = (tp->advmss + MAX_TCP_HEADER +
16 + sizeof(struct sk_buff));
+ while (tcp_win_from_space(rcvmem) < tp->advmss)
+ rcvmem += 128;
space *= rcvmem;
space = min(space, sysctl_tcp_rmem[2]);
- if (space > sk->sk_rcvbuf)
+ if (space > sk->sk_rcvbuf) {
sk->sk_rcvbuf = space;
+
+ /* Make the window clamp follow along. */
+ tp->window_clamp = new_clamp;
+ }
}
}
|