netdev
[Top] [All Lists]

Re: [PATCH] Too aggressive cwnd backoff

To: Baruch Even <baruch@xxxxxxxxx>
Subject: Re: [PATCH] Too aggressive cwnd backoff
From: Stephen Hemminger <shemminger@xxxxxxxx>
Date: Thu, 7 Apr 2005 10:16:53 -0700
Cc: "David S. Miller" <davem@xxxxxxxxxxxxx>, netdev@xxxxxxxxxxx, Werner Almesberger <werner@xxxxxxxxxxxxxxx>
In-reply-to: <20050407164146.GA6479@xxxxxxxxx>
Organization: Open Source Development Lab
References: <20050407164146.GA6479@xxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
On Thu, 7 Apr 2005 19:41:46 +0300
Baruch Even <baruch@xxxxxxxxx> wrote:

> The cwnd backoff is down in two places and drops the cwnd to one quarter
> instead of to one half.
> 
> On congestion events we reset tp->ssthresh to the result of
> tcp_recalc_ssthresh. This cuts the cwnd by half for (New)Reno or to
> a convoluted calculation for BIC.
> 
> Later we will call tcp_cwnd_down for each ack and reduce the cwnd by one
> for every two acks.
> 
> However, in tcp_cwnd_down we will not stop reducing the cwnd until we
> get to limit which is set to tp->ssthresh/2.
> 
> The provided patch will set limit to tp->ssthresh. This was the original
> behaviour in some older version of Linux.
> 
> The patch is against 2.6.11
> 
> Signed-Off-By: Baruch Even <baruch@xxxxxxxxx>

I think this is a real problem, and was observed by Werner with umlsim.
Don't know when it got introduced because it appears to pre-date the
'04 work in adding Westwood, BIC, Vegas. Perhaps Alexey can shed some
light on this.

Going back to the pre-westwood code in BK, the /2 is still there.

----------------
static void tcp_cwnd_down(struct tcp_opt *tp)
{
        int decr = tp->snd_cwnd_cnt + 1;

        tp->snd_cwnd_cnt = decr&1;
        decr >>= 1;

        if (decr && tp->snd_cwnd > tp->snd_ssthresh/2)
                tp->snd_cwnd -= decr;

        tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1);
        tp->snd_cwnd_stamp = tcp_time_stamp;
}

<Prev in Thread] Current Thread [Next in Thread>