Messages in this thread | | | From | Eric Dumazet <> | Date | Thu, 27 Jul 2023 21:31:24 +0200 | Subject | Re: [PATCH net-next 3/3] net: tcp: check timeout by icsk->icsk_timeout in tcp_retransmit_timer() |
| |
On Thu, Jul 27, 2023 at 2:52 PM <menglong8.dong@gmail.com> wrote: > > From: Menglong Dong <imagedong@tencent.com> > > In tcp_retransmit_timer(), a window shrunk connection will be regarded > as timeout if 'tcp_jiffies32 - tp->rcv_tstamp > TCP_RTO_MAX'. This is not > right all the time. > > The retransmits will become zero-window probes in tcp_retransmit_timer() > if the 'snd_wnd==0'. Therefore, the icsk->icsk_rto will come up to > TCP_RTO_MAX sooner or later. > > However, the timer is not precise enough, as it base on timer wheel. > Sorry that I am not good at timer, but I know the concept of time-wheel. > The longer of the timer, the rougher it will be. So the timeout is not > triggered after TCP_RTO_MAX, but 122877ms as I tested. > > Therefore, 'tcp_jiffies32 - tp->rcv_tstamp > TCP_RTO_MAX' is always true > once the RTO come up to TCP_RTO_MAX. > > Fix this by replacing the 'tcp_jiffies32' with '(u32)icsk->icsk_timeout', > which is exact the timestamp of the timeout. > > Signed-off-by: Menglong Dong <imagedong@tencent.com> > --- > net/ipv4/tcp_timer.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c > index 470f581eedd4..3a20db15a186 100644 > --- a/net/ipv4/tcp_timer.c > +++ b/net/ipv4/tcp_timer.c > @@ -511,7 +511,11 @@ void tcp_retransmit_timer(struct sock *sk) > tp->snd_una, tp->snd_nxt); > } > #endif > - if (tcp_jiffies32 - tp->rcv_tstamp > TCP_RTO_MAX) { > + /* It's a little rough here, we regard any valid packet that > + * update tp->rcv_tstamp as the reply of the retransmitted > + * packet. > + */ > + if ((u32)icsk->icsk_timeout - tp->rcv_tstamp > TCP_RTO_MAX) { > tcp_write_err(sk); > goto out; > }
Hmm, this looks like a net candidate, since this is unrelated to the other patches ?
Neal, what do you think ?
| |