[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CA++eYdvm3RVOvu4Eg9op7RaBcn0y6-mczTqgAzinto__WvXLWA@mail.gmail.com>
Date: Wed, 10 Jun 2015 00:41:26 +0200
From: Kenneth Klette Jonassen <kennetkl@....uio.no>
To: Yuchung Cheng <ycheng@...gle.com>
Cc: Kenneth Klette Jonassen <kennetkl@....uio.no>,
netdev <netdev@...r.kernel.org>,
Eric Dumazet <edumazet@...gle.com>,
Stephen Hemminger <stephen@...workplumber.org>,
Neal Cardwell <ncardwell@...gle.com>,
David Hayes <davihay@....uio.no>,
Andreas Petlund <apetlund@...ula.no>,
Dave Taht <dave.taht@...ferbloat.net>,
Nicolas Kuhn <nicolas.kuhn@...ecom-bretagne.eu>
Subject: Re: [PATCH v2 net-next 2/2] tcp: add CDG congestion control
On Tue, Jun 9, 2015 at 7:44 AM, Yuchung Cheng <ycheng@...gle.com> wrote:
> On Mon, Jun 8, 2015 at 10:43 AM, Kenneth Klette Jonassen
> <kennetkl@....uio.no> wrote:
…
>> +enum cdg_state {
>> + CDG_UNKNOWN = 0,
>> + CDG_FULL = 0,
> why duplicate states?
We explicitly infer a full or non-full queue in tcp_cdg_grad().
The unknown state is semantically different; it is before we infer
anything about the network.
We could change the full state to have its own value. (It does not
matter in the current code, but it could be useful for TCP_CC_INFO.)
>> + if (hystart_detect & 1) {
> Define 1 and 2 like cubic does?
>> + prior_snd_cwnd = tp->snd_cwnd;
>> + tcp_reno_cong_avoid(sk, ack, acked);
>> +
>> + if (ca->shadow_wnd) {
>> + u32 incr = tp->snd_cwnd - prior_snd_cwnd;
>> +
>> + ca->shadow_wnd = max(ca->shadow_wnd, ca->shadow_wnd + incr);
> u32 shadow_wnd may overflow?! there might be some bugs ...
CDG can potentially operate without losses over some time, so
shadow_wnd can reach U32_MAX on normal links.
The max() should revert any increment that causes overflow/wrapping of
shadow_wnd.
We limit shadow_wnd to min(shadow_wnd / 2, snd_cwnd) in ssthresh().
>> + if (ca->state == CDG_BACKOFF)
>> + return max(2U, (tp->snd_cwnd * min(1024U, backoff_beta)) >> 10);
>> +
>> + if (ca->state == CDG_NONFULL && use_tolerance) {
>> + bool is_ecn = (tp->prior_ssthresh == 0);
>> +
>> + if (!is_ecn) {
>> + tp->ecn_flags &= ~TCP_ECN_DEMAND_CWR;
>> + return tp->snd_cwnd;
>> + }
> I might be missing something here: cdg_backoff also calls
> tcp_enter_cwr() that clears prior_ssthresh but it's not triggered by
> ECE marks?
That is ok. We set ca->state = CDG_BACKOFF in tcp_cdg_backoff() to
distinguish a delay backoff.
>
> if the intention is to use loss tolerance only when undo is enabled
> why not just check undo_marker?
The intention is to not use loss tolerance if we receive an ECN signal.
Inferring ECN from (prior_ssthresh == 0) is far from perfect of
course, but it is always cleared when receiving ECN.
In tcp_enter_loss(), undo_marker is set after calling ssthresh(). We
could change that, but undo_marker is also imperfect for detecting
ECN.
If in doubt, let us remove the ECN check now. Then in a later patch
set, we could try passing flag to ssthresh like you suggested. We
should also look at tcp_dctcp if we do that.
>> + if (use_shadow)
>> + ca->shadow_wnd = min(ca->shadow_wnd >> 1, tp->snd_cwnd);
>> + else
>> + ca->shadow_wnd = 0;
> it'd be good to not reset shadow_wnd, but only use it if use_shadow.
> so we can monitor shadow_wnd
> in TCP_CC_INFO in the future.
Ok, then we should always set/maintain a shadow_wnd.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists