Message ID | 20180713004919.18608-1-jmaxwell37@gmail.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Series | None | expand |
On 07/12/2018 05:49 PM, Jon Maxwell wrote: > The final patch in this series. Create the tcp_clamp_rto_to_user_timeout() > helper routine. To calculate the correct rto, so that the TCP_USER_TIMEOUT > socket option is more accurate. Taking suggestions and feedback into account > from Eric Dumazet, Neal Cardwell and David Laight. Due to the 1st commit we > can avoid the msecs_to_jiffies() and jiffies_to_msecs() dance. > > Signed-off-by: Jon Maxwell <jmaxwell37@gmail.com> > --- > net/ipv4/tcp_timer.c | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c > index 8ab8c9645294..d4d4b30a6bec 100644 > --- a/net/ipv4/tcp_timer.c > +++ b/net/ipv4/tcp_timer.c > @@ -36,6 +36,22 @@ u32 tcp_retransmit_stamp(const struct sock *sk) > return start_ts; > } > > +static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk) > +{ > + struct inet_connection_sock *icsk = inet_csk(sk); > + u32 elapsed, start_ts; > + > + start_ts = tcp_retransmit_stamp(sk); > + if (!icsk->icsk_user_timeout || !start_ts) > + return icsk->icsk_rto; > + elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts; > + if (elapsed >= icsk->icsk_user_timeout) > + return 1; /* user timeout has passed; fire ASAP */ > + else > + return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - > + elapsed)); if (elapsed >= icsk->icsk_user_timeout) return 1; /* user timeout has passed; fire ASAP */ return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - elapsed)); Thanks !
Sorry Eric, my bad. I'll do another version with the indentation fixed and reformatting of min_t() and resubmit. On Tue, Jul 17, 2018 at 2:00 AM, Eric Dumazet <eric.dumazet@gmail.com> wrote: > > > On 07/12/2018 05:49 PM, Jon Maxwell wrote: >> The final patch in this series. Create the tcp_clamp_rto_to_user_timeout() >> helper routine. To calculate the correct rto, so that the TCP_USER_TIMEOUT >> socket option is more accurate. Taking suggestions and feedback into account >> from Eric Dumazet, Neal Cardwell and David Laight. Due to the 1st commit we >> can avoid the msecs_to_jiffies() and jiffies_to_msecs() dance. >> >> Signed-off-by: Jon Maxwell <jmaxwell37@gmail.com> >> --- >> net/ipv4/tcp_timer.c | 19 ++++++++++++++++++- >> 1 file changed, 18 insertions(+), 1 deletion(-) >> >> diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c >> index 8ab8c9645294..d4d4b30a6bec 100644 >> --- a/net/ipv4/tcp_timer.c >> +++ b/net/ipv4/tcp_timer.c >> @@ -36,6 +36,22 @@ u32 tcp_retransmit_stamp(const struct sock *sk) >> return start_ts; >> } >> >> +static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk) >> +{ >> + struct inet_connection_sock *icsk = inet_csk(sk); >> + u32 elapsed, start_ts; >> + >> + start_ts = tcp_retransmit_stamp(sk); >> + if (!icsk->icsk_user_timeout || !start_ts) >> + return icsk->icsk_rto; >> + elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts; >> + if (elapsed >= icsk->icsk_user_timeout) >> + return 1; /* user timeout has passed; fire ASAP */ >> + else >> + return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - >> + elapsed)); > > if (elapsed >= icsk->icsk_user_timeout) > return 1; /* user timeout has passed; fire ASAP */ > > return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - elapsed)); > > Thanks !
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 8ab8c9645294..d4d4b30a6bec 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -36,6 +36,22 @@ u32 tcp_retransmit_stamp(const struct sock *sk) return start_ts; } +static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk) +{ + struct inet_connection_sock *icsk = inet_csk(sk); + u32 elapsed, start_ts; + + start_ts = tcp_retransmit_stamp(sk); + if (!icsk->icsk_user_timeout || !start_ts) + return icsk->icsk_rto; + elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts; + if (elapsed >= icsk->icsk_user_timeout) + return 1; /* user timeout has passed; fire ASAP */ + else + return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - + elapsed)); +} + /** * tcp_write_err() - close socket and save error info * @sk: The socket the error has appeared on. @@ -544,7 +560,8 @@ void tcp_retransmit_timer(struct sock *sk) /* Use normal (exponential) backoff */ icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX); } - inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, TCP_RTO_MAX); + inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, + tcp_clamp_rto_to_user_timeout(sk), TCP_RTO_MAX); if (retransmits_timed_out(sk, net->ipv4.sysctl_tcp_retries1 + 1, 0)) __sk_dst_reset(sk);
The final patch in this series. Create the tcp_clamp_rto_to_user_timeout() helper routine. To calculate the correct rto, so that the TCP_USER_TIMEOUT socket option is more accurate. Taking suggestions and feedback into account from Eric Dumazet, Neal Cardwell and David Laight. Due to the 1st commit we can avoid the msecs_to_jiffies() and jiffies_to_msecs() dance. Signed-off-by: Jon Maxwell <jmaxwell37@gmail.com> --- net/ipv4/tcp_timer.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)