YeAH-TCP: limited slow start exported function
Subsystems (4)
PATCH 2/2 YeAH-TCP: limited slow start exported function
From: Angelo P. Castellani <[email protected]>
RFC3742: limited slow start
See http://www.ietf.org/rfc/rfc3742.txt
---
To allow code reutilization I've added the limited slow start procedure as an exported symbol of linux tcp congestion control.
On large BDP networks canonical slow start should be avoided because it requires large packet losses to converge, whereas at lower BDPs slow start and limited slow start are identical. Large BDP is defined through the max_ssthresh variable.
I think limited slow start could safely replace the canonical slow start procedure in Linux.
Regards,
Angelo P. Castellani
p.s.: in the attached patch is added an exported function currently used only by YeAH TCP
include/net/tcp.h | 1 +net/ipv4/tcp_cong.c | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
Forgot the patch..
Angelo P. Castellani ha scritto:
Quoted 15 lines
From: Angelo P. Castellani <[email protected]>
RFC3742: limited slow start
See http://www.ietf.org/rfc/rfc3742.txt
Signed-off-by Angelo P. Castellani <[email protected]>---
To allow code reutilization I've added the limited slow start procedure as an exported symbol of linux tcp congestion control.
On large BDP networks canonical slow start should be avoided because it requires large packet losses to converge, whereas at lower BDPs slow start and limited slow start are identical. Large BDP is defined through the
max_ssthreshvariable.I think limited slow start could safely replace the canonical slow start procedure in Linux.
Quoted 10 lines
Regards,
Angelo P. Castellanip.s.: in the attached patch is added an exported function currently used only by YeAH TCP
include/net/tcp.h| 1 +net/ipv4/tcp_cong.c| 23 +++++++++++++++++++++++2 files changed, 24 insertions(+)
include/net/tcp.h +1 -0
@@ -669,6 +669,7 @@ extern void tcp_get_allowed_congestion_cextern int tcp_set_allowed_congestion_control (char *allowed);extern int tcp_set_congestion_control (struct sock *sk,const char *name);extern void tcp_slow_start (struct tcp_sock *tp); +extern void tcp_limited_slow_start (struct tcp_sock *tp);extern struct tcp_congestion_ops tcp_init_congestion_ops;extern u32 tcp_reno_ssthresh (struct sock *sk);
net/ipv4/tcp_cong.c +23 -0
@@ -297,6 +297,29 @@ void tcp_slow_start(struct tcp_sock *tp) }EXPORT_SYMBOL_GPL (tcp_slow_start); +void tcp_limited_slow_start (struct tcp_sock *tp) +{ +/* RFC3742: limited slow start +* the window is increased by 1/K MSS for each arriving ACK, +* for K = int(cwnd/(0.5 max_ssthresh)) +*/ + +const int max_ssthresh =100 ; + +if (max_ssthresh >0 && tp->snd_cwnd > max_ssthresh) { +u32 k =max (tp->snd_cwnd / (max_ssthresh >>1 ),1U ); +if (++tp->snd_cwnd_cnt >= k) { +if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + tp->snd_cwnd_cnt =0 ; + } + }else { +if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + } +} +EXPORT_SYMBOL_GPL (tcp_limited_slow_start); +/* * TCP Reno congestion control * This is special case used for fallback as well.
I'd prefer to make it apply automatically across all congestion controls that do slow-start, and also make the max_ssthresh parameter controllable via sysctl. This patch (attached) should implement this. Note the default value for sysctl_tcp_max_ssthresh = 0, which disables limited slow-start. This should make ABC apply during LSS as well.
Note the patch is compile-tested only! I can do some real testing if you'd like to apply this Dave.
Thanks,
-John
Quoted 66 lines · Angelo P. Castellani
Forgot the patch..
Angelo P. Castellani ha scritto:
Quoted 15 lines
From: Angelo P. Castellani <[email protected]>
RFC3742: limited slow start
See http://www.ietf.org/rfc/rfc3742.txt
Signed-off-by Angelo P. Castellani <[email protected]>---
To allow code reutilization I've added the limited slow start procedure as an exported symbol of linux tcp congestion control.
On large BDP networks canonical slow start should be avoided because it requires large packet losses to converge, whereas at lower BDPs slow start and limited slow start are identical. Large BDP is defined through the
max_ssthreshvariable.I think limited slow start could safely replace the canonical slow start procedure in Linux.
Quoted 10 lines
Regards,
Angelo P. Castellanip.s.: in the attached patch is added an exported function currently used only by YeAH TCP
include/net/tcp.h| 1 +net/ipv4/tcp_cong.c| 23 +++++++++++++++++++++++2 files changed, 24 insertions(+)------------------------------------------------------------------------
diff -uprN
linux-2.6.20-a/include/net/tcp.hlinux-2.6.20-c/include/net/tcp.hinclude/net/tcp.h +1
-0@@ -669,6 +669,7 @@ extern void tcp_get_allowed_congestion_cextern int tcp_set_allowed_congestion_control (char *allowed);extern int tcp_set_congestion_control (struct sock *sk,const char *name);extern void tcp_slow_start (struct tcp_sock *tp); +extern void tcp_limited_slow_start (struct tcp_sock *tp);extern struct tcp_congestion_ops tcp_init_congestion_ops;extern u32 tcp_reno_ssthresh (struct sock *sk);diff -uprN
linux-2.6.20-a/net/ipv4/tcp_cong.clinux-2.6.20-c/net/ipv4/tcp_cong.cnet/ipv4/tcp_cong.c +16
-0@@ -297,6 +297,29 @@ void tcp_slow_start(struct tcp_sock *tp) }EXPORT_SYMBOL_GPL (tcp_slow_start); +void tcp_limited_slow_start (struct tcp_sock *tp) +{ +/* RFC3742: limited slow start +* the window is increased by 1/K MSS for each arriving ACK, +* for K = int(cwnd/(0.5 max_ssthresh)) +*/ + +const int max_ssthresh =100 ; + +if (max_ssthresh >0 && tp->snd_cwnd > max_ssthresh) { +u32 k =max (tp->snd_cwnd / (max_ssthresh >>1 ),1U ); +if (++tp->snd_cwnd_cnt >= k) { +if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + tp->snd_cwnd_cnt =0 ; + }
net/ipv4/tcp_cong.c void tcp_slow_start(struct tcp_sock *tp) · line 325
Quoted 10 lines
net/ipv4/tcp_cong.c +7
-0+ }else { +if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + } +} +EXPORT_SYMBOL_GPL (tcp_limited_slow_start); +/* * TCP Reno congestion control * This is special case used for fallback as well.
Add RFC3742 Limited Slow-Start, controlled by variable sysctl_tcp_max_ssthresh.
---
commit 97033fa201705e6cfc68ce66f34ede3277c3d645
tree 5df4607728abce93aa05b31015a90f2ce369abff
parent 8a03d9a498eaf02c8a118752050a5154852c13bf
author John Heffner <[email protected]> Mon, 19 Feb 2007 15:52:16 -0500 committer John Heffner <[email protected]> Mon, 19 Feb 2007 15:52:16 -0500
include/linux/sysctl.h | 1 + include/net/tcp.h | 1 + net/ipv4/sysctl_net_ipv4.c | 8 ++++++++ net/ipv4/tcp_cong.c | 33 +++++++++++++++++++++++---------- 4 files changed, 33 insertions(+), 10 deletions(-)
include/linux/sysctl.h +1 -0
@@ -438,6 +438,7 @@ enumNET_CIPSOV4_RBM_STRICTVALID =121 ,NET_TCP_AVAIL_CONG_CONTROL =122 ,NET_TCP_ALLOWED_CONG_CONTROL =123 , + NET_TCP_MAX_SSTHRESH=124, }; enum {
include/net/tcp.h +1 -0
@@ -230,6 +230,7 @@ extern int sysctl_tcp_mtu_probing;extern int sysctl_tcp_base_mss;extern int sysctl_tcp_workaround_signed_windows;extern int sysctl_tcp_slow_start_after_idle; +extern int sysctl_tcp_max_ssthresh;extern atomic_t tcp_memory_allocated;extern atomic_t tcp_sockets_allocated;
net/ipv4/sysctl_net_ipv4.c +8 -0
@@ -803,6 +803,14 @@ #endif /* CONFIG_NETLABEL */ .proc_handler = &proc_allowed_congestion_control, .strategy = &strategy_allowed_congestion_control, }, + { + .ctl_name = NET_TCP_MAX_SSTHRESH, + .procname = "tcp_max_ssthresh", + .data = &sysctl_tcp_max_ssthresh, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { .ctl_name = 0 } };
net/ipv4/tcp_cong.c +23 -10
@@ -12,6 +12,8 @@ #include <linux/types.h>#include <linux/list.h> #include <net/tcp.h> +int sysctl_tcp_max_ssthresh =0 ; +static DEFINE_SPINLOCK (tcp_cong_list_lock);static LIST_HEAD (tcp_cong_list);
@@ -271,10 +273,13 @@ #endif/* -* Linear increase during slow start +* Slow start (exponential increase) with +* RFC3742 Limited Slow Start (fast linear increase) support. */ void tcp_slow_start (struct tcp_sock *tp) { +int cnt =0 ; +if (sysctl_tcp_abc) {/* RFC3465: Slow Start * TCP sender SHOULD increase cwnd by the number of
@@ -283,17 +288,25 @@ void tcp_slow_start(struct tcp_sock *tp)*/ if (tp->bytes_acked < tp->mss_cache)return ; - -/* We MAY increase by 2 if discovered delayed ack */ -if (sysctl_tcp_abc >1 && tp->bytes_acked >=2 *tp->mss_cache) { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - } } + +if (sysctl_tcp_max_ssthresh >0 && + tp->snd_cwnd > sysctl_tcp_max_ssthresh) + cnt += sysctl_tcp_max_ssthresh>>1 ; +else + cnt += tp->snd_cwnd; + +/* RFC3465: We MAY increase by 2 if discovered delayed ack */ +if (sysctl_tcp_abc >1 && tp->bytes_acked >=2 *tp->mss_cache) + cnt <<=1 ; tp->bytes_acked =0 ; - -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; + + tp->snd_cwnd_cnt += cnt; +while (tp->snd_cwnd_cnt >= tp->snd_cwnd) { +if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + tp->snd_cwnd_cnt -= tp->snd_cwnd; + } }EXPORT_SYMBOL_GPL (tcp_slow_start);
John Heffner ha scritto:
Quoted 1 line
Note the patch is compile-tested only! I can do some real testing if you'd like to apply this Dave.
The date you read on the patch is due to the fact I've splitted this patchset into 2 diff files. This isn't compile-tested only, I've used this piece of code for about 3 months.
However more testing is good and welcome.
Regards,
Angelo P. Castellani
Quoted 3 lines · Angelo P. Castellani
John Heffner ha scritto:
Quoted 1 line
Note the patch is compile-tested only! I can do some real testing if you'd like to apply this Dave.
The date you read on the patch is due to the fact I've splitted this patchset into 2 diff files. This isn't compile-tested only, I've used this piece of code for about 3 months.
Sorry for the confusion. The patch I attached to my message was compile-tested only.
Thanks,
-John
John Heffner ha scritto:
Quoted 1 line
Sorry for the confusion. The patch I attached to my message was compile-tested only.
Well I've read your reply by night and I haven't seen that you attached a patch. Sorry for that.
Kind regards,
Angelo
David Miller
maintainerFrom: John Heffner <[email protected]>
Date: Mon, 19 Feb 2007 16:00:06 -0500
Quoted 8 lines
I'd prefer to make it apply automatically across all congestion controls that do slow-start, and also make the
max_ssthreshparameter controllable via sysctl. This patch (attached) should implement this. Note the default value forsysctl_tcp_max_ssthresh= 0, which disables limited slow-start. This should make ABC apply during LSS as well.Note the patch is compile-tested only! I can do some real testing if you'd like to apply this Dave.
I'll apply this, but could you please also when making suggestions like this provide the patch necessary to kill the function added for YeaH and the call site in the YeaH algorithm?
When people post conflicting code bits for this for inclusion, it makes work very difficult for me.
What I want to do right now is back everything out and let you guys sort it out, but I don't want to do that because it would mean that I just wasted an entire hour reviewing the YeaH patches. :-/
David Miller
maintainerFrom: David Miller <[email protected]>
Date: Thu, 22 Feb 2007 00:27:04 -0800 (PST)
Quoted 3 lines
I'll apply this, but could you please also when making suggestions like this provide the patch necessary to kill the function added for YeaH and the call site in the YeaH algorithm?
Here is how I'm resolving this:
net/ipv4/tcp_cong.c +0 -23
@@ -310,29 +310,6 @@ void tcp_slow_start(struct tcp_sock *tp) }EXPORT_SYMBOL_GPL (tcp_slow_start); -void tcp_limited_slow_start (struct tcp_sock *tp) -{ -/* RFC3742: limited slow start -* the window is increased by 1/K MSS for each arriving ACK, -* for K = int(cwnd/(0.5 max_ssthresh)) -*/ - -const int max_ssthresh =100 ; - -if (max_ssthresh >0 && tp->snd_cwnd > max_ssthresh) { -u32 k =max (tp->snd_cwnd / (max_ssthresh >>1 ),1U ); -if (++tp->snd_cwnd_cnt >= k) { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - tp->snd_cwnd_cnt =0 ; - } - }else { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - } -} -EXPORT_SYMBOL_GPL (tcp_limited_slow_start); -/* * TCP Reno congestion control * This is special case used for fallback as well.
net/ipv4/tcp_yeah.c +1 -1
@@ -104,7 +104,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack,return ;if (tp->snd_cwnd <= tp->snd_ssthresh) { -tcp_limited_slow_start (tp); +tcp_slow_start (tp); }else if (!yeah->doing_reno_now) {/* Scalable */
My patch is meant as a replacement for YeAH patch 2/2, not meant to back it out. You do still need the second hunk below. Sorry 'bout that.
If you're going to apply YeAH patch 2/2 first, you will also need to remove the declaration of tcp_limited_slow_start() in include/net/tcp.h.
Thanks,
-John
Quoted 60 lines · David Miller
From: David Miller <[email protected]>
Date: Thu, 22 Feb 2007 00:27:04 -0800 (PST)Quoted 3 lines
I'll apply this, but could you please also when making suggestions like this provide the patch necessary to kill the function added for YeaH and the call site in the YeaH algorithm?
Here is how I'm resolving this:
net/ipv4/tcp_cong.c +0
-23@@ -310,29 +310,6 @@ void tcp_slow_start(struct tcp_sock *tp) }EXPORT_SYMBOL_GPL (tcp_slow_start); -void tcp_limited_slow_start (struct tcp_sock *tp) -{ -/* RFC3742: limited slow start -* the window is increased by 1/K MSS for each arriving ACK, -* for K = int(cwnd/(0.5 max_ssthresh)) -*/ - -const int max_ssthresh =100 ; - -if (max_ssthresh >0 && tp->snd_cwnd > max_ssthresh) { -u32 k =max (tp->snd_cwnd / (max_ssthresh >>1 ),1U ); -if (++tp->snd_cwnd_cnt >= k) { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - tp->snd_cwnd_cnt =0 ; - } - }else { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; - } -} -EXPORT_SYMBOL_GPL (tcp_limited_slow_start); -/* * TCP Reno congestion control * This is special case used for fallback as well. net/ipv4/tcp_yeah.c +1
-2@@ -104,7 +104,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack,return ;if (tp->snd_cwnd <= tp->snd_ssthresh) { -tcp_limited_slow_start (tp); +tcp_slow_start (tp); }else if (!yeah->doing_reno_now) {/* Scalable */ -To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
David Miller
maintainerFrom: John Heffner <[email protected]>
Date: Thu, 22 Feb 2007 09:25:07 -0500
Quoted 5 lines
My patch is meant as a replacement for YeAH patch 2/2, not meant to back it out. You do still need the second hunk below. Sorry 'bout that.
If you're going to apply YeAH patch 2/2 first, you will also need to remove the declaration of
tcp_limited_slow_start()ininclude/net/tcp.h.
I noticed that after sending out my diff and corrected it before pushing to tcp-2.6, thanks :-)
David Miller
maintainerFrom: "Angelo P. Castellani" <[email protected]>
Date: Mon, 19 Feb 2007 11:35:09 +0100
Quoted 19 lines
From: Angelo P. Castellani <[email protected]>
RFC3742: limited slow start
See http://www.ietf.org/rfc/rfc3742.txt
Signed-off-by Angelo P. Castellani <[email protected]>---
To allow code reutilization I've added the limited slow start procedure as an exported symbol of linux tcp congestion control.
On large BDP networks canonical slow start should be avoided because it requires large packet losses to converge, whereas at lower BDPs slow start and limited slow start are identical. Large BDP is defined through the
max_ssthreshvariable.I think limited slow start could safely replace the canonical slow start procedure in Linux.
...
Quoted 2 lines
p.s.: in the attached patch is added an exported function currently used only by YeAH TCP
Please never submit patches like this, submit the infrastructure FIRST, then submit the stuff that uses it. When a sequence of patches is applied, in sequence, the tree should build properly (even with all available new options enabled) at each step along the way.
Otherwise we have the situation we have now, in that YeaH is in my tree but doesn't build successfully.
What I'm going to do to "fix" this, is yank YeaH implementation out of my tree, add this second patch first, then add the YeaH patch back.
Please never do this again.
Ok, I've missed this bit in the submitting patches documentation.. however sorry for that.
2007/2/22, David Miller <[email protected]>:
Quoted 14 lines
Please never submit patches like this, submit the infrastructure FIRST, then submit the stuff that uses it. When a sequence of patches is applied, in sequence, the tree should build properly (even with all available new options enabled) at each step along the way.
Otherwise we have the situation we have now, in that YeaH is in my tree but doesn't build successfully.
What I'm going to do to "fix" this, is yank YeaH implementation out of my tree, add this second patch first, then add the YeaH patch back.
Please never do this again.