Netdev List
 help / color / mirror / Atom feed
From: "Xiaoliang (David) Wei" <davidwei79@gmail.com>
To: "Stephen Hemminger" <shemminger@osdl.org>
Cc: "John Heffner" <jheffner@psc.edu>, netdev@vger.kernel.org
Subject: Re: The AI parameter of tcp_highspeed.c (in 2.6.18)
Date: Mon, 12 Jun 2006 10:10:17 -0700	[thread overview]
Message-ID: <7335583a0606121010g5efde29frd35f88defef82c72@mail.gmail.com> (raw)
In-Reply-To: <20060602120507.7e1206d8@dxpl.pdx.osdl.net>

Thanks, Stephen. But I think there is still a problem with the AIMD
parameter update in HighSpeed TCP code.

Line 125~138 of the code (net/ipv4/tcp_highspeed.c):

	/* Update AIMD parameters */
	if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
		while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
		       ca->ai < HSTCP_AIMD_MAX - 1)
			ca->ai++;
	} else if (tp->snd_cwnd < hstcp_aimd_vals[ca->ai].cwnd) {
		while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
		       ca->ai > 0)
			ca->ai--;

In fact, the second part (decreasing ca->ai) never decreases since the
while loop's inequality is in the reverse direction. This leads to
unfairness with multiple flows (once a flow happens to enjoy a higher
ca->ai, it keeps enjoying that even its cwnd decreases)

Here is a tentative fix (I also added a comment, trying to keep the
change clear):

--- /home/weixl/linux-2.6.16.18/net/ipv4/tcp_highspeed.c	2006-05-22
11:04:35.000000000 -0700
+++ /home/weixl/linux-2.6.16.18/net/ipv4/tcp_highspeed.c.new	2006-06-12
09:56:40.000000000 -0700
@@ -123,13 +123,13 @@
 		tcp_slow_start(tp);
 	else {
 		/* Update AIMD parameters */
+		/* We want to guarantee that hstcp_aimd_vals[ca->ai-1].cwnd  <
snd_cwnd <= hstcp_aimd_vals[ca->ai].cwnd */
 		if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
 			while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
 			       ca->ai < HSTCP_AIMD_MAX - 1)
 				ca->ai++;
-		} else if (tp->snd_cwnd < hstcp_aimd_vals[ca->ai].cwnd) {
-			while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
-			       ca->ai > 0)
+		} else if (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd) {
+			while (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd)
 				ca->ai--;
 		}

Thanks.

-David

On 6/2/06, Stephen Hemminger <shemminger@osdl.org> wrote:
> Went backed and looked at the RFC. The problem was just a simple
> translation of table to C array (0 based). Added this to the TCP testing repository.
>
> Subject: [PATCH] Problem observed by Xiaoliang (David) Wei:
>
>   When snd_cwnd is smaller than 38 and the connection is in
>   congestion avoidance phase (snd_cwnd > snd_ssthresh), the snd_cwnd
>   seems to stop growing.
>
> The additive increase was confused because C array's are 0 based.
>
> Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
>
> ---
>
>  net/ipv4/tcp_highspeed.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>
> 121685b7b61c8faeb87e6c6f0c346b0fe1c46fd2
> diff --git a/net/ipv4/tcp_highspeed.c b/net/ipv4/tcp_highspeed.c
> index b72fa55..ba7c63c 100644
> --- a/net/ipv4/tcp_highspeed.c
> +++ b/net/ipv4/tcp_highspeed.c
> @@ -135,7 +135,8 @@ static void hstcp_cong_avoid(struct sock
>
>                 /* Do additive increase */
>                 if (tp->snd_cwnd < tp->snd_cwnd_clamp) {
> -                       tp->snd_cwnd_cnt += ca->ai;
> +                       /* cwnd = cwnd + a(w) / cwnd */
> +                       tp->snd_cwnd_cnt += ca->ai + 1;
>                         if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
>                                 tp->snd_cwnd_cnt -= tp->snd_cwnd;
>                                 tp->snd_cwnd++;
> --
> 1.3.3
>
>


-- 
Xiaoliang (David) Wei      Graduate Student, CS@Caltech
http://davidwei.org
***********************************************

      parent reply	other threads:[~2006-06-12 17:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-30  4:12 The AI parameter of tcp_highspeed.c (in 2.6.18) Xiaoliang (David) Wei
2006-06-02 19:05 ` Stephen Hemminger
2006-06-03  0:51   ` David Miller
2006-06-12 17:10   ` Xiaoliang (David) Wei [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7335583a0606121010g5efde29frd35f88defef82c72@mail.gmail.com \
    --to=davidwei79@gmail.com \
    --cc=jheffner@psc.edu \
    --cc=netdev@vger.kernel.org \
    --cc=shemminger@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox