* initial congestion window for connections in the listen queue
@ 2009-04-13 20:46 Octavian Purdila
2009-04-13 21:26 ` David Miller
0 siblings, 1 reply; 7+ messages in thread
From: Octavian Purdila @ 2009-04-13 20:46 UTC (permalink / raw)
To: netdev
A question for the TCP wizards:
>struct sock *tcp_create_openreq_child(struct sock *sk,
> struct request_sock >*req, struct sk_buff *skb)
>{
>...
> /* So many TCP implementations out there (incorrectly) count the
> * initial SYN frame in their delayed-ACK and congestion control
> * algorithms that we must have the following bandaid to talk
> * efficiently to them. -DaveM
> */
> newtp->snd_cwnd = 2;
Shouldn't the same logic from tcp_init_cwnd() be used here?
>From my traces, this seems to prevent TSO from helping short lived
connections.
Thanks,
tavi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-13 20:46 initial congestion window for connections in the listen queue Octavian Purdila
@ 2009-04-13 21:26 ` David Miller
2009-04-13 21:54 ` Ilpo Järvinen
0 siblings, 1 reply; 7+ messages in thread
From: David Miller @ 2009-04-13 21:26 UTC (permalink / raw)
To: opurdila; +Cc: netdev
From: Octavian Purdila <opurdila@ixiacom.com>
Date: Mon, 13 Apr 2009 23:46:15 +0300
>
> A question for the TCP wizards:
>
>>struct sock *tcp_create_openreq_child(struct sock *sk,
>> struct request_sock >*req, struct sk_buff *skb)
>>{
>>...
>> /* So many TCP implementations out there (incorrectly) count the
>> * initial SYN frame in their delayed-ACK and congestion control
>> * algorithms that we must have the following bandaid to talk
>> * efficiently to them. -DaveM
>> */
>> newtp->snd_cwnd = 2;
>
> Shouldn't the same logic from tcp_init_cwnd() be used here?
>
>>From my traces, this seems to prevent TSO from helping short lived
> connections.
On any standard ethernet MTU or larger, you should be getting
an initial CWND of 3 or 4 because of the logic in tcp_init_cwnd().
Don't just guesstimate what initial ->snd_cwnd value the
kernel is using by looking casually at tcpdump traces. Add
some kernel debugging printk's and find out for sure.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-13 21:26 ` David Miller
@ 2009-04-13 21:54 ` Ilpo Järvinen
2009-04-13 21:58 ` David Miller
0 siblings, 1 reply; 7+ messages in thread
From: Ilpo Järvinen @ 2009-04-13 21:54 UTC (permalink / raw)
To: David Miller; +Cc: opurdila, Netdev
On Mon, 13 Apr 2009, David Miller wrote:
> From: Octavian Purdila <opurdila@ixiacom.com>
> Date: Mon, 13 Apr 2009 23:46:15 +0300
>
> >
> > A question for the TCP wizards:
> >
> >>struct sock *tcp_create_openreq_child(struct sock *sk,
> >> struct request_sock >*req, struct sk_buff *skb)
> >>{
> >>...
> >> /* So many TCP implementations out there (incorrectly) count the
> >> * initial SYN frame in their delayed-ACK and congestion control
> >> * algorithms that we must have the following bandaid to talk
> >> * efficiently to them. -DaveM
> >> */
> >> newtp->snd_cwnd = 2;
> >
> > Shouldn't the same logic from tcp_init_cwnd() be used here?
> >
> >>From my traces, this seems to prevent TSO from helping short lived
> > connections.
>
> On any standard ethernet MTU or larger, you should be getting
> an initial CWND of 3 or 4 because of the logic in tcp_init_cwnd().
>
> Don't just guesstimate what initial ->snd_cwnd value the
> kernel is using by looking casually at tcpdump traces. Add
> some kernel debugging printk's and find out for sure.
A long-standing feature in tcp_init_metrics() is such that any of its goto
reset prevents call to tcp_init_cwnd(). I never remembered to fix that.
--
i.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-13 21:54 ` Ilpo Järvinen
@ 2009-04-13 21:58 ` David Miller
2009-04-14 8:37 ` Ilpo Järvinen
0 siblings, 1 reply; 7+ messages in thread
From: David Miller @ 2009-04-13 21:58 UTC (permalink / raw)
To: ilpo.jarvinen; +Cc: opurdila, netdev
From: "Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi>
Date: Tue, 14 Apr 2009 00:54:40 +0300 (EEST)
> A long-standing feature in tcp_init_metrics() is such that any of its goto
> reset prevents call to tcp_init_cwnd(). I never remembered to fix that.
Grumble, we definitely need to fix that!
I suspect I added that problem, because tcp_init_metrics() at one
point couldn't cope with a NULL dst. But that is no longer the
case so I'm pretty sure we can unconditionally go:
tp->snd_cwnd = tcp_init_cwnd(tp, dst);
tp->snd_cwnd_stamp = tcp_time_stamp;
in the 'reset' path too, right?
But note thata even if this reset path is taken, we should still have
at least the default ->snd_cwnd value of 2.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-13 21:58 ` David Miller
@ 2009-04-14 8:37 ` Ilpo Järvinen
2009-04-14 9:09 ` David Miller
2009-04-14 13:48 ` Octavian Purdila
0 siblings, 2 replies; 7+ messages in thread
From: Ilpo Järvinen @ 2009-04-14 8:37 UTC (permalink / raw)
To: David Miller; +Cc: opurdila, Netdev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1987 bytes --]
On Mon, 13 Apr 2009, David Miller wrote:
> From: "Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi>
> Date: Tue, 14 Apr 2009 00:54:40 +0300 (EEST)
>
> > A long-standing feature in tcp_init_metrics() is such that any of its goto
> > reset prevents call to tcp_init_cwnd(). I never remembered to fix that.
>
> Grumble, we definitely need to fix that!
>
> I suspect I added that problem, because tcp_init_metrics() at one
> point couldn't cope with a NULL dst.
I suppose you meant tcp_init_cwnd() here, otherwise this doesn't make much
sense to me?
> But that is no longer the
> case so I'm pretty sure we can unconditionally go:
>
> tp->snd_cwnd = tcp_init_cwnd(tp, dst);
> tp->snd_cwnd_stamp = tcp_time_stamp;
>
> in the 'reset' path too, right?
At least it compiles... :-) ...I don't see any problems either.
> But note thata even if this reset path is taken, we should still have
> at least the default ->snd_cwnd value of 2.
Right, it wasn't be uninitialized as we get that 2 from elsewhere.
A patch below.
--
[PATCH] tcp: fix >2 iw selection
A long-standing feature in tcp_init_metrics() is such that
any of its goto reset prevents call to tcp_init_cwnd().
Compile tested.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
net/ipv4/tcp_input.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 4872524..00ba37b 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -928,6 +928,8 @@ static void tcp_init_metrics(struct sock *sk)
tcp_set_rto(sk);
if (inet_csk(sk)->icsk_rto < TCP_TIMEOUT_INIT && !tp->rx_opt.saw_tstamp)
goto reset;
+
+cwnd:
tp->snd_cwnd = tcp_init_cwnd(tp, dst);
tp->snd_cwnd_stamp = tcp_time_stamp;
return;
@@ -942,6 +944,7 @@ reset:
tp->mdev = tp->mdev_max = tp->rttvar = TCP_TIMEOUT_INIT;
inet_csk(sk)->icsk_rto = TCP_TIMEOUT_INIT;
}
+ goto cwnd;
}
static void tcp_update_reordering(struct sock *sk, const int metric,
--
1.5.2.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-14 8:37 ` Ilpo Järvinen
@ 2009-04-14 9:09 ` David Miller
2009-04-14 13:48 ` Octavian Purdila
1 sibling, 0 replies; 7+ messages in thread
From: David Miller @ 2009-04-14 9:09 UTC (permalink / raw)
To: ilpo.jarvinen; +Cc: opurdila, netdev
From: "Ilpo Järvinen" <ilpo.jarvinen@helsinki.fi>
Date: Tue, 14 Apr 2009 11:37:08 +0300 (EEST)
> [PATCH] tcp: fix >2 iw selection
>
> A long-standing feature in tcp_init_metrics() is such that
> any of its goto reset prevents call to tcp_init_cwnd().
>
> Compile tested.
>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Looks good, applied, thanks!
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: initial congestion window for connections in the listen queue
2009-04-14 8:37 ` Ilpo Järvinen
2009-04-14 9:09 ` David Miller
@ 2009-04-14 13:48 ` Octavian Purdila
1 sibling, 0 replies; 7+ messages in thread
From: Octavian Purdila @ 2009-04-14 13:48 UTC (permalink / raw)
To: Ilpo Järvinen; +Cc: David Miller, Netdev
On Tuesday 14 April 2009 11:37:08 Ilpo Järvinen wrote:
> > But that is no longer the
> > case so I'm pretty sure we can unconditionally go:
> >
> > tp->snd_cwnd = tcp_init_cwnd(tp, dst);
> > tp->snd_cwnd_stamp = tcp_time_stamp;
> >
> > in the 'reset' path too, right?
>
> At least it compiles... :-) ...I don't see any problems either.
>
Confirming that it is fixing the issue I was seeing.
Thanks a lot for the quick responses and the fix !
Thanks,
tavi
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-04-14 13:49 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-13 20:46 initial congestion window for connections in the listen queue Octavian Purdila
2009-04-13 21:26 ` David Miller
2009-04-13 21:54 ` Ilpo Järvinen
2009-04-13 21:58 ` David Miller
2009-04-14 8:37 ` Ilpo Järvinen
2009-04-14 9:09 ` David Miller
2009-04-14 13:48 ` Octavian Purdila
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).