mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-06 06:43:13 -04:00
Merge branch 'tcp-allow-to-reduce-max-rto'
Eric Dumazet says: ==================== tcp: allow to reduce max RTO This is a followup of a discussion started 6 months ago by Jason Xing. Some applications want to lower the time between each retransmit attempts. TCP_KEEPINTVL and TCP_KEEPCNT socket options don't work around the issue. This series adds: - a new TCP level socket option (TCP_RTO_MAX_MS) - a new sysctl (/proc/sys/net/ipv4/tcp_rto_max_ms) Admins and/or applications can now change the max rto value at their own risk. Link: https://lore.kernel.org/netdev/20240715033118.32322-1-kerneljasonxing@gmail.com/T/ ==================== Link: https://patch.msgid.link/20250207152830.2527578-1-edumazet@google.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -705,6 +705,8 @@ tcp_retries2 - INTEGER
|
||||
seconds and is a lower bound for the effective timeout.
|
||||
TCP will effectively time out at the first RTO which exceeds the
|
||||
hypothetical timeout.
|
||||
If tcp_rto_max_ms is decreased, it is recommended to also
|
||||
change tcp_retries2.
|
||||
|
||||
RFC 1122 recommends at least 100 seconds for the timeout,
|
||||
which corresponds to a value of at least 8.
|
||||
@@ -1237,6 +1239,17 @@ tcp_rto_min_us - INTEGER
|
||||
|
||||
Default: 200000
|
||||
|
||||
tcp_rto_max_ms - INTEGER
|
||||
Maximal TCP retransmission timeout (in ms).
|
||||
Note that TCP_RTO_MAX_MS socket option has higher precedence.
|
||||
|
||||
When changing tcp_rto_max_ms, it is important to understand
|
||||
that tcp_retries2 might need a change.
|
||||
|
||||
Possible Values: 1000 - 120,000
|
||||
|
||||
Default: 120,000
|
||||
|
||||
UDP variables
|
||||
=============
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ struct timer_list icsk_retransmit_timer read_mostly
|
||||
struct timer_list icsk_delack_timer read_mostly inet_csk_reset_xmit_timer,tcp_connect
|
||||
u32 icsk_rto read_write tcp_cwnd_validate,tcp_schedule_loss_probe,tcp_connect_init,tcp_connect,tcp_write_xmit,tcp_push_one
|
||||
u32 icsk_rto_min
|
||||
u32 icsk_rto_max read_mostly tcp_reset_xmit_timer
|
||||
u32 icsk_delack_max
|
||||
u32 icsk_pmtu_cookie read_write tcp_sync_mss,tcp_current_mss,tcp_send_syn_data,tcp_connect_init,tcp_connect
|
||||
struct tcp_congestion_ops icsk_ca_ops read_write tcp_cwnd_validate,tcp_tso_segs,tcp_ca_dst_init,tcp_connect_init,tcp_connect,tcp_write_xmit
|
||||
|
||||
@@ -86,6 +86,7 @@ u8 sysctl_tcp_sack
|
||||
u8 sysctl_tcp_window_scaling tcp_syn_options,tcp_parse_options
|
||||
u8 sysctl_tcp_timestamps
|
||||
u8 sysctl_tcp_early_retrans read_mostly tcp_schedule_loss_probe(tcp_write_xmit)
|
||||
u32 sysctl_tcp_rto_max_ms
|
||||
u8 sysctl_tcp_recovery tcp_fastretrans_alert
|
||||
u8 sysctl_tcp_thin_linear_timeouts tcp_retrans_timer(on_thin_streams)
|
||||
u8 sysctl_tcp_slow_start_after_idle unlikely(tcp_cwnd_validate-network-not-starved)
|
||||
|
||||
@@ -90,6 +90,7 @@ struct inet_connection_sock {
|
||||
struct timer_list icsk_delack_timer;
|
||||
__u32 icsk_rto;
|
||||
__u32 icsk_rto_min;
|
||||
u32 icsk_rto_max;
|
||||
__u32 icsk_delack_max;
|
||||
__u32 icsk_pmtu_cookie;
|
||||
const struct tcp_congestion_ops *icsk_ca_ops;
|
||||
|
||||
@@ -181,6 +181,7 @@ struct netns_ipv4 {
|
||||
u8 sysctl_tcp_window_scaling;
|
||||
u8 sysctl_tcp_timestamps;
|
||||
int sysctl_tcp_rto_min_us;
|
||||
int sysctl_tcp_rto_max_ms;
|
||||
u8 sysctl_tcp_recovery;
|
||||
u8 sysctl_tcp_thin_linear_timeouts;
|
||||
u8 sysctl_tcp_slow_start_after_idle;
|
||||
|
||||
@@ -143,8 +143,9 @@ static_assert((1 << ATO_BITS) > TCP_DELACK_MAX);
|
||||
#define TCP_DELACK_MIN 4U
|
||||
#define TCP_ATO_MIN 4U
|
||||
#endif
|
||||
#define TCP_RTO_MAX ((unsigned)(120*HZ))
|
||||
#define TCP_RTO_MIN ((unsigned)(HZ/5))
|
||||
#define TCP_RTO_MAX_SEC 120
|
||||
#define TCP_RTO_MAX ((unsigned)(TCP_RTO_MAX_SEC * HZ))
|
||||
#define TCP_RTO_MIN ((unsigned)(HZ / 5))
|
||||
#define TCP_TIMEOUT_MIN (2U) /* Min timeout for TCP timers in jiffies */
|
||||
|
||||
#define TCP_TIMEOUT_MIN_US (2*USEC_PER_MSEC) /* Min TCP timeout in microsecs */
|
||||
@@ -740,10 +741,14 @@ int tcp_mtu_to_mss(struct sock *sk, int pmtu);
|
||||
int tcp_mss_to_mtu(struct sock *sk, int mss);
|
||||
void tcp_mtup_init(struct sock *sk);
|
||||
|
||||
static inline unsigned int tcp_rto_max(const struct sock *sk)
|
||||
{
|
||||
return READ_ONCE(inet_csk(sk)->icsk_rto_max);
|
||||
}
|
||||
|
||||
static inline void tcp_bound_rto(struct sock *sk)
|
||||
{
|
||||
if (inet_csk(sk)->icsk_rto > TCP_RTO_MAX)
|
||||
inet_csk(sk)->icsk_rto = TCP_RTO_MAX;
|
||||
inet_csk(sk)->icsk_rto = min(inet_csk(sk)->icsk_rto, tcp_rto_max(sk));
|
||||
}
|
||||
|
||||
static inline u32 __tcp_set_rto(const struct tcp_sock *tp)
|
||||
@@ -1424,10 +1429,12 @@ static inline unsigned long tcp_pacing_delay(const struct sock *sk)
|
||||
static inline void tcp_reset_xmit_timer(struct sock *sk,
|
||||
const int what,
|
||||
unsigned long when,
|
||||
const unsigned long max_when)
|
||||
bool pace_delay)
|
||||
{
|
||||
inet_csk_reset_xmit_timer(sk, what, when + tcp_pacing_delay(sk),
|
||||
max_when);
|
||||
if (pace_delay)
|
||||
when += tcp_pacing_delay(sk);
|
||||
inet_csk_reset_xmit_timer(sk, what, when,
|
||||
tcp_rto_max(sk));
|
||||
}
|
||||
|
||||
/* Something is really bad, we could not queue an additional packet,
|
||||
@@ -1456,7 +1463,7 @@ static inline void tcp_check_probe_timer(struct sock *sk)
|
||||
{
|
||||
if (!tcp_sk(sk)->packets_out && !inet_csk(sk)->icsk_pending)
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
|
||||
tcp_probe0_base(sk), TCP_RTO_MAX);
|
||||
tcp_probe0_base(sk), true);
|
||||
}
|
||||
|
||||
static inline void tcp_init_wl(struct tcp_sock *tp, u32 seq)
|
||||
|
||||
@@ -136,6 +136,7 @@ enum {
|
||||
#define TCP_AO_REPAIR 42 /* Get/Set SNEs and ISNs */
|
||||
|
||||
#define TCP_IS_MPTCP 43 /* Is MPTCP being used? */
|
||||
#define TCP_RTO_MAX_MS 44 /* max rto time in ms */
|
||||
|
||||
#define TCP_REPAIR_ON 1
|
||||
#define TCP_REPAIR_OFF 0
|
||||
|
||||
@@ -28,6 +28,7 @@ static int tcp_adv_win_scale_max = 31;
|
||||
static int tcp_app_win_max = 31;
|
||||
static int tcp_min_snd_mss_min = TCP_MIN_SND_MSS;
|
||||
static int tcp_min_snd_mss_max = 65535;
|
||||
static int tcp_rto_max_max = TCP_RTO_MAX_SEC * MSEC_PER_SEC;
|
||||
static int ip_privileged_port_min;
|
||||
static int ip_privileged_port_max = 65535;
|
||||
static int ip_ttl_min = 1;
|
||||
@@ -1583,6 +1584,15 @@ static struct ctl_table ipv4_net_table[] = {
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = SYSCTL_ONE,
|
||||
},
|
||||
{
|
||||
.procname = "tcp_rto_max_ms",
|
||||
.data = &init_net.ipv4.sysctl_tcp_rto_max_ms,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = SYSCTL_ONE_THOUSAND,
|
||||
.extra2 = &tcp_rto_max_max,
|
||||
},
|
||||
};
|
||||
|
||||
static __net_init int ipv4_sysctl_init_net(struct net *net)
|
||||
|
||||
@@ -423,7 +423,7 @@ void tcp_init_sock(struct sock *sk)
|
||||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int rto_min_us;
|
||||
int rto_min_us, rto_max_ms;
|
||||
|
||||
tp->out_of_order_queue = RB_ROOT;
|
||||
sk->tcp_rtx_queue = RB_ROOT;
|
||||
@@ -432,6 +432,10 @@ void tcp_init_sock(struct sock *sk)
|
||||
INIT_LIST_HEAD(&tp->tsorted_sent_queue);
|
||||
|
||||
icsk->icsk_rto = TCP_TIMEOUT_INIT;
|
||||
|
||||
rto_max_ms = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rto_max_ms);
|
||||
icsk->icsk_rto_max = msecs_to_jiffies(rto_max_ms);
|
||||
|
||||
rto_min_us = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rto_min_us);
|
||||
icsk->icsk_rto_min = usecs_to_jiffies(rto_min_us);
|
||||
icsk->icsk_delack_max = TCP_DELACK_MAX;
|
||||
@@ -3807,6 +3811,11 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
|
||||
secs_to_retrans(val, TCP_TIMEOUT_INIT / HZ,
|
||||
TCP_RTO_MAX / HZ));
|
||||
return 0;
|
||||
case TCP_RTO_MAX_MS:
|
||||
if (val < MSEC_PER_SEC || val > TCP_RTO_MAX_SEC * MSEC_PER_SEC)
|
||||
return -EINVAL;
|
||||
WRITE_ONCE(inet_csk(sk)->icsk_rto_max, msecs_to_jiffies(val));
|
||||
return 0;
|
||||
}
|
||||
|
||||
sockopt_lock_sock(sk);
|
||||
@@ -4643,6 +4652,9 @@ int do_tcp_getsockopt(struct sock *sk, int level,
|
||||
case TCP_IS_MPTCP:
|
||||
val = 0;
|
||||
break;
|
||||
case TCP_RTO_MAX_MS:
|
||||
val = jiffies_to_msecs(tcp_rto_max(sk));
|
||||
break;
|
||||
default:
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
@@ -274,8 +274,8 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk,
|
||||
* because it's been added to the accept queue directly.
|
||||
*/
|
||||
req->timeout = tcp_timeout_init(child);
|
||||
inet_csk_reset_xmit_timer(child, ICSK_TIME_RETRANS,
|
||||
req->timeout, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(child, ICSK_TIME_RETRANS,
|
||||
req->timeout, false);
|
||||
|
||||
refcount_set(&req->rsk_refcnt, 2);
|
||||
|
||||
|
||||
@@ -2252,8 +2252,7 @@ static bool tcp_check_sack_reneging(struct sock *sk, int *ack_flag)
|
||||
unsigned long delay = max(usecs_to_jiffies(tp->srtt_us >> 4),
|
||||
msecs_to_jiffies(10));
|
||||
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
delay, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS, delay, false);
|
||||
*ack_flag &= ~FLAG_SET_XMIT_TIMER;
|
||||
return true;
|
||||
}
|
||||
@@ -3282,8 +3281,7 @@ void tcp_rearm_rto(struct sock *sk)
|
||||
*/
|
||||
rto = usecs_to_jiffies(max_t(int, delta_us, 1));
|
||||
}
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS, rto,
|
||||
TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS, rto, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3560,10 +3558,10 @@ static void tcp_ack_probe(struct sock *sk)
|
||||
* This function is not for random using!
|
||||
*/
|
||||
} else {
|
||||
unsigned long when = tcp_probe0_when(sk, TCP_RTO_MAX);
|
||||
unsigned long when = tcp_probe0_when(sk, tcp_rto_max(sk));
|
||||
|
||||
when = tcp_clamp_probe0_to_user_timeout(sk, when);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_PROBE0, when, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_PROBE0, when, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6469,9 +6467,8 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
||||
after(TCP_SKB_CB(skb)->ack_seq, tp->snd_nxt)) {
|
||||
/* Previous FIN/ACK or RST/ACK might be ignored. */
|
||||
if (icsk->icsk_retransmits == 0)
|
||||
inet_csk_reset_xmit_timer(sk,
|
||||
ICSK_TIME_RETRANS,
|
||||
TCP_TIMEOUT_MIN, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
TCP_TIMEOUT_MIN, false);
|
||||
SKB_DR_SET(reason, TCP_INVALID_ACK_SEQUENCE);
|
||||
goto reset_and_undo;
|
||||
}
|
||||
@@ -6586,8 +6583,8 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
||||
*/
|
||||
inet_csk_schedule_ack(sk);
|
||||
tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS);
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
|
||||
TCP_DELACK_MAX, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_DACK,
|
||||
TCP_DELACK_MAX, false);
|
||||
goto consume;
|
||||
}
|
||||
tcp_send_ack(sk);
|
||||
|
||||
@@ -458,15 +458,14 @@ void tcp_ld_RTO_revert(struct sock *sk, u32 seq)
|
||||
|
||||
icsk->icsk_backoff--;
|
||||
icsk->icsk_rto = tp->srtt_us ? __tcp_set_rto(tp) : TCP_TIMEOUT_INIT;
|
||||
icsk->icsk_rto = inet_csk_rto_backoff(icsk, TCP_RTO_MAX);
|
||||
icsk->icsk_rto = inet_csk_rto_backoff(icsk, tcp_rto_max(sk));
|
||||
|
||||
tcp_mstamp_refresh(tp);
|
||||
delta_us = (u32)(tp->tcp_mstamp - tcp_skb_timestamp_us(skb));
|
||||
remaining = icsk->icsk_rto - usecs_to_jiffies(delta_us);
|
||||
|
||||
if (remaining > 0) {
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
remaining, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS, remaining, false);
|
||||
} else {
|
||||
/* RTO revert clocked out retransmission.
|
||||
* Will retransmit now.
|
||||
@@ -3533,6 +3532,7 @@ static int __net_init tcp_sk_init(struct net *net)
|
||||
|
||||
net->ipv4.sysctl_tcp_pingpong_thresh = 1;
|
||||
net->ipv4.sysctl_tcp_rto_min_us = jiffies_to_usecs(TCP_RTO_MIN);
|
||||
net->ipv4.sysctl_tcp_rto_max_ms = TCP_RTO_MAX_SEC * MSEC_PER_SEC;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2910,7 +2910,7 @@ bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto)
|
||||
if (rto_delta_us > 0)
|
||||
timeout = min_t(u32, timeout, usecs_to_jiffies(rto_delta_us));
|
||||
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_LOSS_PROBE, timeout, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_LOSS_PROBE, timeout, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3544,8 +3544,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
|
||||
}
|
||||
if (rearm_timer)
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
inet_csk(sk)->icsk_rto,
|
||||
TCP_RTO_MAX);
|
||||
inet_csk(sk)->icsk_rto, true);
|
||||
}
|
||||
|
||||
/* We allow to exceed memory limits for FIN packets to expedite
|
||||
@@ -4162,8 +4161,8 @@ int tcp_connect(struct sock *sk)
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_ACTIVEOPENS);
|
||||
|
||||
/* Timer for repeating the SYN until an answer. */
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
inet_csk(sk)->icsk_rto, false);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_connect);
|
||||
@@ -4252,11 +4251,11 @@ void __tcp_send_ack(struct sock *sk, u32 rcv_nxt)
|
||||
unsigned long delay;
|
||||
|
||||
delay = TCP_DELACK_MAX << icsk->icsk_ack.retry;
|
||||
if (delay < TCP_RTO_MAX)
|
||||
if (delay < tcp_rto_max(sk))
|
||||
icsk->icsk_ack.retry++;
|
||||
inet_csk_schedule_ack(sk);
|
||||
icsk->icsk_ack.ato = TCP_ATO_MIN;
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, delay, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_DACK, delay, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4392,7 +4391,7 @@ void tcp_send_probe0(struct sock *sk)
|
||||
if (err <= 0) {
|
||||
if (icsk->icsk_backoff < READ_ONCE(net->ipv4.sysctl_tcp_retries2))
|
||||
icsk->icsk_backoff++;
|
||||
timeout = tcp_probe0_when(sk, TCP_RTO_MAX);
|
||||
timeout = tcp_probe0_when(sk, tcp_rto_max(sk));
|
||||
} else {
|
||||
/* If packet was not sent due to local congestion,
|
||||
* Let senders fight for local resources conservatively.
|
||||
@@ -4401,7 +4400,7 @@ void tcp_send_probe0(struct sock *sk)
|
||||
}
|
||||
|
||||
timeout = tcp_clamp_probe0_to_user_timeout(sk, timeout);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_PROBE0, timeout, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_PROBE0, timeout, true);
|
||||
}
|
||||
|
||||
int tcp_rtx_synack(const struct sock *sk, struct request_sock *req)
|
||||
|
||||
@@ -109,7 +109,7 @@ static int tcp_out_of_resources(struct sock *sk, bool do_reset)
|
||||
|
||||
/* If peer does not open window for long time, or did not transmit
|
||||
* anything for long time, penalize it. */
|
||||
if ((s32)(tcp_jiffies32 - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset)
|
||||
if ((s32)(tcp_jiffies32 - tp->lsndtime) > 2*tcp_rto_max(sk) || !do_reset)
|
||||
shift++;
|
||||
|
||||
/* If some dubious ICMP arrived, penalize even more. */
|
||||
@@ -189,12 +189,12 @@ static unsigned int tcp_model_timeout(struct sock *sk,
|
||||
{
|
||||
unsigned int linear_backoff_thresh, timeout;
|
||||
|
||||
linear_backoff_thresh = ilog2(TCP_RTO_MAX / rto_base);
|
||||
linear_backoff_thresh = ilog2(tcp_rto_max(sk) / rto_base);
|
||||
if (boundary <= linear_backoff_thresh)
|
||||
timeout = ((2 << boundary) - 1) * rto_base;
|
||||
else
|
||||
timeout = ((2 << linear_backoff_thresh) - 1) * rto_base +
|
||||
(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
|
||||
(boundary - linear_backoff_thresh) * tcp_rto_max(sk);
|
||||
return jiffies_to_msecs(timeout);
|
||||
}
|
||||
/**
|
||||
@@ -268,7 +268,7 @@ static int tcp_write_timeout(struct sock *sk)
|
||||
|
||||
retry_until = READ_ONCE(net->ipv4.sysctl_tcp_retries2);
|
||||
if (sock_flag(sk, SOCK_DEAD)) {
|
||||
const bool alive = icsk->icsk_rto < TCP_RTO_MAX;
|
||||
const bool alive = icsk->icsk_rto < tcp_rto_max(sk);
|
||||
|
||||
retry_until = tcp_orphan_retries(sk, alive);
|
||||
do_reset = alive ||
|
||||
@@ -416,7 +416,8 @@ static void tcp_probe_timer(struct sock *sk)
|
||||
}
|
||||
max_probes = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_retries2);
|
||||
if (sock_flag(sk, SOCK_DEAD)) {
|
||||
const bool alive = inet_csk_rto_backoff(icsk, TCP_RTO_MAX) < TCP_RTO_MAX;
|
||||
unsigned int rto_max = tcp_rto_max(sk);
|
||||
const bool alive = inet_csk_rto_backoff(icsk, rto_max) < rto_max;
|
||||
|
||||
max_probes = tcp_orphan_retries(sk, alive);
|
||||
if (!alive && icsk->icsk_backoff >= max_probes)
|
||||
@@ -481,8 +482,8 @@ static void tcp_fastopen_synack_timer(struct sock *sk, struct request_sock *req)
|
||||
tcp_update_rto_stats(sk);
|
||||
if (!tp->retrans_stamp)
|
||||
tp->retrans_stamp = tcp_time_stamp_ts(tp);
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
req->timeout << req->num_timeout, TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
req->timeout << req->num_timeout, false);
|
||||
}
|
||||
|
||||
static bool tcp_rtx_probe0_timed_out(const struct sock *sk,
|
||||
@@ -492,7 +493,7 @@ static bool tcp_rtx_probe0_timed_out(const struct sock *sk,
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
u32 user_timeout = READ_ONCE(icsk->icsk_user_timeout);
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
int timeout = TCP_RTO_MAX * 2;
|
||||
int timeout = tcp_rto_max(sk) * 2;
|
||||
s32 rcv_delta;
|
||||
|
||||
if (user_timeout) {
|
||||
@@ -626,9 +627,9 @@ void tcp_retransmit_timer(struct sock *sk)
|
||||
/* Retransmission failed because of local congestion,
|
||||
* Let senders fight for local resources conservatively.
|
||||
*/
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
TCP_RESOURCE_PROBE_INTERVAL,
|
||||
TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
TCP_RESOURCE_PROBE_INTERVAL,
|
||||
false);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -665,7 +666,7 @@ void tcp_retransmit_timer(struct sock *sk)
|
||||
icsk->icsk_backoff = 0;
|
||||
icsk->icsk_rto = clamp(__tcp_set_rto(tp),
|
||||
tcp_rto_min(sk),
|
||||
TCP_RTO_MAX);
|
||||
tcp_rto_max(sk));
|
||||
} else if (sk->sk_state != TCP_SYN_SENT ||
|
||||
tp->total_rto >
|
||||
READ_ONCE(net->ipv4.sysctl_tcp_syn_linear_timeouts)) {
|
||||
@@ -673,10 +674,10 @@ void tcp_retransmit_timer(struct sock *sk)
|
||||
* activated.
|
||||
*/
|
||||
icsk->icsk_backoff++;
|
||||
icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);
|
||||
icsk->icsk_rto = min(icsk->icsk_rto << 1, tcp_rto_max(sk));
|
||||
}
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
tcp_clamp_rto_to_user_timeout(sk), TCP_RTO_MAX);
|
||||
tcp_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
tcp_clamp_rto_to_user_timeout(sk), false);
|
||||
if (retransmits_timed_out(sk, READ_ONCE(net->ipv4.sysctl_tcp_retries1) + 1, 0))
|
||||
__sk_dst_reset(sk);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user