net: TCP thin-stream latency-improving modifications
Subsystems (4)
v5 cover net: TCP thin-stream latency-improving modifications
This is a series of patches enabling non-intrusive, dynamically triggered modifications that improve retransmission latencies for thin streams.
The patch set was modified according to the feedback received.
Major change:
-Used bitfields to compact the nonagle variable
in the tcp_sock struct. nonagle, thin_lto and thin_dupack is now contained in the same u8.
I decided to use bitfields to handle this as it is already done similarly in the tcp_options_received struct.
Also corrected some formatting issues.
Cheers,
Andreas Petlund
PATCH v5 1/3 net: TCP thin-stream detection
Inline function to dynamically detect thin streams based on the number of packets in flight. Used to dynamically trigger thin-stream mechanisms if enabled by ioctl or sysctl.
--- Documentation/networking/tcp-thin.txt | 47 +++++++++++++++++++++++++++++++++ include/net/tcp.h | 8 +++++ 2 files changed, 55 insertions(+), 0 deletions(-) create mode 100644 Documentation/networking/tcp-thin.txt
Documentation/networking/tcp-thin.txt new file +47 -0
@@ -0,0 +1,47 @@ +Thin-streams and TCP +==================== +A wide range of Internet-based services that use reliable transport +protocols display what we call thin-stream properties. This means +that the application sends data with such a low rate that the +retransmission mechanisms of the transport protocol are not fully +effective. In time-dependent scenarios (like online games, control +systems, stock trading etc.) where the user experience depends +on the data delivery latency, packet loss can be devastating for +the service quality. Extreme latencies are caused by TCP's +dependency on the arrival of new data from the application to trigger +retransmissions effectively through fast retransmit instead of +waiting for long timeouts. + +After analysing a large number of time-dependent interactive +applications, we have seen that they often produce thin streams +and also stay with this traffic pattern throughout its entire +lifespan. The combination of time-dependency and the fact that the +streams provoke high latencies when using TCP is unfortunate. + +In order to reduce application-layer latency when packets are lost, +a set of mechanisms has been made, which address these latency issues +for thin streams. In short, if the kernel detects a thin stream, +the retransmission mechanisms are modified in the following manner: + +1) If the stream is thin, fast retransmit on the first dupACK. +2) If the stream is thin, do not apply exponential backoff. + +These enhancements are applied only if the stream is detected as +thin. This is accomplished by defining a threshold for the number +of packets in flight. If there are less than 4 packets in flight, +fast retransmissions can not be triggered, and the stream is prone +to experience high retransmission latencies. + +Since these mechanisms are targeted at time-dependent applications, +they must be specifically activated by the application using the +TCP_THIN_LINEAR_TIMEOUTS and TCP_THIN_DUPACK IOCTLS or the +tcp_thin_linear_timeouts and tcp_thin_dupack sysctls. Both +modifications are turned off by default. + +References +========== +More information on the modifications, as well as a wide range of +experimental data can be found here: +"Improving latency for interactive, thin-stream applications over +reliable transport" +http://simula.no/research/nd/publications/Simula.nd.477/simula_pdf_file
include/net/tcp.h +8 -0
@@ -1386,6 +1386,14 @@ static inline void tcp_highest_sack_combine(struct sock *sk,tcp_sk (sk)->highest_sack = new; } +/* Determines whether this is a thin stream (which may suffer from +* increased latency). Used to trigger latency-reducing mechanisms. +*/ +static inline unsigned int tcp_stream_is_thin (struct tcp_sock *tp) +{ +return tp->packets_out <4 && !tcp_in_initial_slowstart (tp); +} +/* /proc */ enum tcp_seq_states {TCP_SEQ_STATE_LISTENING ,
Signature · 1 line
1.6.3.3
PATCH v5 2/3 net: TCP thin linear timeouts
In reply to Andreas PetlundThis patch will make TCP use only linear timeouts if the stream is thin. This will help to avoid the very high latencies that thin stream suffer because of exponential backoff. This mechanism is only active if enabled by iocontrol or syscontrol and the stream is identified as thin. A maximum of 6 linear timeouts is tried before exponential backoff is resumed.
--- Documentation/networking/ip-sysctl.txt | 12 ++++++++++++ include/linux/tcp.h | 5 ++++- include/net/tcp.h | 4 ++++ net/ipv4/sysctl_net_ipv4.c | 7 +++++++ net/ipv4/tcp.c | 7 +++++++ net/ipv4/tcp_timer.c | 21 ++++++++++++++++++++- 6 files changed, 54 insertions(+), 2 deletions(-)
Documentation/networking/ip-sysctl.txt +12 -0
@@ -487,6 +487,18 @@ tcp_dma_copybreak - INTEGER and CONFIG_NET_DMA is enabled. Default: 4096 +tcp_thin_linear_timeouts - BOOLEAN + Enable dynamic triggering of linear timeouts for thin streams. + If set, a check is performed upon retransmission by timeout to + determine if the stream is thin (less than 4 packets in flight). + As long as the stream is found to be thin, up to 6 linear + timeouts may be performed before exponential backoff mode is + initiated. This improves retransmission latency for + non-aggressive thin streams, often found to be time-dependent. + For more information on thin streams, see + Documentation/networking/tcp-thin.txt + Default: 0 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max
include/linux/tcp.h +4 -1
@@ -103,6 +103,7 @@ enum {#define TCP_CONGESTION 13/* Congestion control algorithm */ #define TCP_MD5SIG 14/* TCP MD5 Signature (RFC2385) */ #define TCP_COOKIE_TRANSACTIONS 15/* TCP Cookie Transactions */ +#define TCP_THIN_LINEAR_TIMEOUTS 16/* Use linear timeouts for thin streams*/ /* for TCP_INFO socket option */ #define TCPI_OPT_TIMESTAMPS 1
@@ -340,7 +341,9 @@ struct tcp_sock {u32 frto_highmark;/* snd_nxt when RTO occurred */ u16 advmss;/* Advertised MSS */ u8 frto_counter;/* Number of new acks after RTO */ -u8 nonagle;/* Disable Nagle algorithm? */ + u8 nonagle : 4,/* Disable Nagle algorithm? */ + thin_lto : 1,/* Use linear timeouts for thin streams */ + unused : 3;/* RTT measurement */ u32 srtt;/* smoothed round trip time << 3 */
include/net/tcp.h +4 -0
@@ -196,6 +196,9 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);#define TCP_NAGLE_CORK 2/* Socket is corked */ #define TCP_NAGLE_PUSH 4/* Cork is overridden for already queued data */ +/* TCP thin-stream limits */ +#define TCP_THIN_LINEAR_RETRIES 6/* After 6 linear retries, do exp. backoff */ +extern struct inet_timewait_death_row tcp_death_row;/* sysctl variables for tcp */
@@ -241,6 +244,7 @@ extern int sysctl_tcp_workaround_signed_windows;extern int sysctl_tcp_slow_start_after_idle;extern int sysctl_tcp_max_ssthresh;extern int sysctl_tcp_cookie_size; +extern int sysctl_tcp_thin_linear_timeouts;extern atomic_t tcp_memory_allocated;extern struct percpu_counter tcp_sockets_allocated;
net/ipv4/sysctl_net_ipv4.c +7 -0
@@ -576,6 +576,13 @@ static struct ctl_table ipv4_table[] = { .proc_handler = proc_dointvec }, { + .procname = "tcp_thin_linear_timeouts", + .data = &sysctl_tcp_thin_linear_timeouts, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, + { .procname = "udp_mem", .data = &sysctl_udp_mem, .maxlen = sizeof(sysctl_udp_mem),
net/ipv4/tcp.c +7 -0
@@ -2229,6 +2229,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, }break ; +case TCP_THIN_LINEAR_TIMEOUTS : +if (val <0 || val >1 ) + err = -EINVAL ; +else + tp->thin_lto = val; +break ; +case TCP_CORK :/* When set indicates to always queue non-full frames. * Later the user clears this option and we transmit
net/ipv4/tcp_timer.c +20 -1
@@ -29,6 +29,7 @@ int sysctl_tcp_keepalive_intvl __read_mostly = TCP_KEEPALIVE_INTVL;int sysctl_tcp_retries1__read_mostly =TCP_RETR1 ;int sysctl_tcp_retries2__read_mostly =TCP_RETR2 ;int sysctl_tcp_orphan_retries__read_mostly ; +int sysctl_tcp_thin_linear_timeouts__read_mostly ;static void tcp_write_timer (unsigned long );static void tcp_delack_timer (unsigned long );
@@ -415,7 +416,25 @@ void tcp_retransmit_timer(struct sock *sk) icsk->icsk_retransmits++; out_reset_timer: - icsk->icsk_rto =min (icsk->icsk_rto <<1 ,TCP_RTO_MAX ); +/* If stream is thin, use linear timeouts. Since 'icsk_backoff' is +* used to reset timer, set to 0. Recalculate 'icsk_rto' as this +* might be increased if the stream oscillates between thin and thick, +* thus the old value might already be too high compared to the value +* set by 'tcp_set_rto' in tcp_input.c which resets the rto without +* backoff. Limit to TCP_THIN_LINEAR_RETRIES before initiating +* exponential backoff behaviour to avoid continue hammering +* linear-timeout retransmissions into a black hole +*/ +if (sk->sk_state ==TCP_ESTABLISHED && + (tp->thin_lto || sysctl_tcp_thin_linear_timeouts) && +tcp_stream_is_thin (tp) && + icsk->icsk_retransmits <=TCP_THIN_LINEAR_RETRIES ) { + icsk->icsk_backoff =0 ; + icsk->icsk_rto =min (__tcp_set_rto (tp),TCP_RTO_MAX ); + }else { +/* 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 );if (retransmits_timed_out (sk, sysctl_tcp_retries1 +1 ))__sk_dst_reset (sk);
Signature · 1 line
1.6.3.3
PATCH v5 3/3 net: TCP thin dupack
In reply to Andreas PetlundThis patch enables fast retransmissions after one dupACK for TCP if the stream is identified as thin. This will reduce latencies for thin streams that are not able to trigger fast retransmissions due to high packet interarrival time. This mechanism is only active if enabled by iocontrol or syscontrol and the stream is identified as thin.
--- Documentation/networking/ip-sysctl.txt | 12 ++++++++++++ include/linux/tcp.h | 4 +++- include/net/tcp.h | 1 + net/ipv4/sysctl_net_ipv4.c | 7 +++++++ net/ipv4/tcp.c | 7 +++++++ net/ipv4/tcp_input.c | 12 ++++++++++++ 6 files changed, 42 insertions(+), 1 deletions(-)
Documentation/networking/ip-sysctl.txt +12 -0
@@ -499,6 +499,18 @@ tcp_thin_linear_timeouts - BOOLEAN Documentation/networking/tcp-thin.txt Default: 0 +tcp_thin_dupack - BOOLEAN + Enable dynamic triggering of retransmissions after one dupACK + for thin streams. If set, a check is performed upon reception + of a dupACK to determine if the stream is thin (less than 4 + packets in flight). As long as the stream is found to be thin, + data is retransmitted on the first received dupACK. This + improves retransmission latency for non-aggressive thin + streams, often found to be time-dependent. + For more information on thin streams, see + Documentation/networking/tcp-thin.txt + Default: 0 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max
include/linux/tcp.h +3 -1
@@ -104,6 +104,7 @@ enum {#define TCP_MD5SIG 14/* TCP MD5 Signature (RFC2385) */ #define TCP_COOKIE_TRANSACTIONS 15/* TCP Cookie Transactions */ #define TCP_THIN_LINEAR_TIMEOUTS 16/* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK 17/* Fast retrans. after 1 dupack */ /* for TCP_INFO socket option */ #define TCPI_OPT_TIMESTAMPS 1
@@ -343,7 +344,8 @@ struct tcp_sock {u8 frto_counter;/* Number of new acks after RTO */ u8 nonagle : 4,/* Disable Nagle algorithm? */ thin_lto : 1,/* Use linear timeouts for thin streams */ - unused : 3; + thin_dupack : 1,/* Fast retransmit on first dupack */ + unused : 2;/* RTT measurement */ u32 srtt;/* smoothed round trip time << 3 */
include/net/tcp.h +1 -0
@@ -245,6 +245,7 @@ extern int sysctl_tcp_slow_start_after_idle;extern int sysctl_tcp_max_ssthresh;extern int sysctl_tcp_cookie_size;extern int sysctl_tcp_thin_linear_timeouts; +extern int sysctl_tcp_thin_dupack;extern atomic_t tcp_memory_allocated;extern struct percpu_counter tcp_sockets_allocated;
net/ipv4/sysctl_net_ipv4.c +7 -0
@@ -582,6 +582,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_thin_dupack", + .data = &sysctl_tcp_thin_dupack, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, { .procname = "udp_mem", .data = &sysctl_udp_mem,
net/ipv4/tcp.c +7 -0
@@ -2236,6 +2236,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, tp->thin_lto = val;break ; +case TCP_THIN_DUPACK : +if (val <0 || val >1 ) + err = -EINVAL ; +else + tp->thin_dupack = val; +break ; +case TCP_CORK :/* When set indicates to always queue non-full frames. * Later the user clears this option and we transmit
net/ipv4/tcp_input.c +12 -0
@@ -89,6 +89,8 @@ int sysctl_tcp_frto __read_mostly = 2;int sysctl_tcp_frto_response__read_mostly ;int sysctl_tcp_nometrics_save__read_mostly ; +int sysctl_tcp_thin_dupack__read_mostly ; +int sysctl_tcp_moderate_rcvbuf__read_mostly =1 ;int sysctl_tcp_abc__read_mostly ;
@@ -2447,6 +2449,16 @@ static int tcp_time_to_recover(struct sock *sk)return 1 ; } +/* If a thin stream is detected, retransmit after first +* received dupack. Employ only if SACK is supported in order +* to avoid possible corner-case series of spurious retransmissions +* Use only if there are no unsent data. +*/ +if ((tp->thin_dupack || sysctl_tcp_thin_dupack) && +tcp_stream_is_thin (tp) &&tcp_dupack_heuristics (tp) >1 && +tcp_is_sack (tp) && sk->sk_send_head ==NULL ) +return 1 ; +return 0 ; }
Signature · 1 line
1.6.3.3
Re: [net-next PATCH v5 3/3] net: TCP thin dupack
Quoted 126 lines · Andreas Petlund
This patch enables fast retransmissions after one dupACK for TCP if the stream is identified as thin. This will reduce latencies for thin streams that are not able to trigger fast retransmissions due to high packet interarrival time. This mechanism is only active if enabled by iocontrol or syscontrol and the stream is identified as thin.
Signed-off-by Andreas Petlund <[email protected]>--- Documentation/networking/ip-sysctl.txt | 12 ++++++++++++ include/linux/tcp.h | 4 +++- include/net/tcp.h | 1 + net/ipv4/sysctl_net_ipv4.c | 7 +++++++ net/ipv4/tcp.c | 7 +++++++ net/ipv4/tcp_input.c | 12 ++++++++++++ 6 files changed, 42 insertions(+), 1 deletions(-)Documentation/networking/ip-sysctl.txt +12
-0@@ -499,6 +499,18 @@ tcp_thin_linear_timeouts - BOOLEAN Documentation/networking/tcp-thin.txt Default: 0 +tcp_thin_dupack - BOOLEAN + Enable dynamic triggering of retransmissions after one dupACK + for thin streams. If set, a check is performed upon reception + of a dupACK to determine if the stream is thin (less than 4 + packets in flight). As long as the stream is found to be thin, + data is retransmitted on the first received dupACK. This + improves retransmission latency for non-aggressive thin + streams, often found to be time-dependent. + For more information on thin streams, see + Documentation/networking/tcp-thin.txt + Default: 0 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, maxinclude/linux/tcp.h +3
-1@@ -104,6 +104,7 @@ enum {#define TCP_MD5SIG 14/* TCP MD5 Signature (RFC2385) */ #define TCP_COOKIE_TRANSACTIONS 15/* TCP Cookie Transactions */ #define TCP_THIN_LINEAR_TIMEOUTS 16/* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK 17/* Fast retrans. after 1 dupack */ /* for TCP_INFO socket option */ #define TCPI_OPT_TIMESTAMPS 1@@ -343,7 +344,8 @@ struct tcp_sock {u8 frto_counter;/* Number of new acks after RTO */ u8 nonagle : 4,/* Disable Nagle algorithm? */ thin_lto : 1,/* Use linear timeouts for thin streams */ - unused : 3; + thin_dupack : 1,/* Fast retransmit on first dupack */ + unused : 2;/* RTT measurement */ u32 srtt;/* smoothed round trip time << 3 */ include/net/tcp.h +1
-0@@ -245,6 +245,7 @@ extern int sysctl_tcp_slow_start_after_idle;extern int sysctl_tcp_max_ssthresh;extern int sysctl_tcp_cookie_size;extern int sysctl_tcp_thin_linear_timeouts; +extern int sysctl_tcp_thin_dupack;extern atomic_t tcp_memory_allocated;extern struct percpu_counter tcp_sockets_allocated;net/ipv4/sysctl_net_ipv4.c +7
-0@@ -582,6 +582,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_thin_dupack", + .data = &sysctl_tcp_thin_dupack, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, { .procname = "udp_mem", .data = &sysctl_udp_mem,net/ipv4/tcp.c +7
-0@@ -2236,6 +2236,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, tp->thin_lto = val;break ; +case TCP_THIN_DUPACK : +if (val <0 || val >1 ) + err = -EINVAL ; +else + tp->thin_dupack = val; +break ; +case TCP_CORK :/* When set indicates to always queue non-full frames. * Later the user clears this option and we transmit net/ipv4/tcp_input.c +2
-0@@ -89,6 +89,8 @@ int sysctl_tcp_frto __read_mostly = 2;int sysctl_tcp_frto_response__read_mostly ;int sysctl_tcp_nometrics_save__read_mostly ; +int sysctl_tcp_thin_dupack__read_mostly ; +int sysctl_tcp_moderate_rcvbuf__read_mostly =1 ;int sysctl_tcp_abc__read_mostly ;@@ -2447,6 +2449,16 @@ static int tcp_time_to_recover(struct sock *sk)return 1 ;
net/ipv4/tcp_input.c static int tcp_time_to_recover(struct sock *sk) · line 2459
Quoted 10 lines
net/ipv4/tcp_input.c +8
-0} +/* If a thin stream is detected, retransmit after first +* received dupack. Employ only if SACK is supported in order +* to avoid possible corner-case series of spurious retransmissions +* Use only if there are no unsent data. +*/ +if ((tp->thin_dupack || sysctl_tcp_thin_dupack) && +tcp_stream_is_thin (tp) &&tcp_dupack_heuristics (tp) >1 && +tcp_is_sack (tp) && sk->sk_send_head ==NULL )
Use tcp_send_head(sk) instead.
net/ipv4/tcp_input.c static int tcp_time_to_recover(struct sock *sk) · line 2463
Quoted 4 lines
net/ipv4/tcp_input.c +2
-0+return 1 ; +return 0 ; }
Other than that,
Signature · 1 line
i.
PATCH v5 3/3 net: TCP thin dupack
This patch enables fast retransmissions after one dupACK for TCP if the stream is identified as thin. This will reduce latencies for thin streams that are not able to trigger fast retransmissions due to high packet interarrival time. This mechanism is only active if enabled by iocontrol or syscontrol and the stream is identified as thin.
--- Documentation/networking/ip-sysctl.txt | 12 ++++++++++++ include/linux/tcp.h | 4 +++- include/net/tcp.h | 1 + net/ipv4/sysctl_net_ipv4.c | 7 +++++++ net/ipv4/tcp.c | 7 +++++++ net/ipv4/tcp_input.c | 12 ++++++++++++ 6 files changed, 42 insertions(+), 1 deletions(-)
Documentation/networking/ip-sysctl.txt +12 -0
@@ -499,6 +499,18 @@ tcp_thin_linear_timeouts - BOOLEAN Documentation/networking/tcp-thin.txt Default: 0 +tcp_thin_dupack - BOOLEAN + Enable dynamic triggering of retransmissions after one dupACK + for thin streams. If set, a check is performed upon reception + of a dupACK to determine if the stream is thin (less than 4 + packets in flight). As long as the stream is found to be thin, + data is retransmitted on the first received dupACK. This + improves retransmission latency for non-aggressive thin + streams, often found to be time-dependent. + For more information on thin streams, see + Documentation/networking/tcp-thin.txt + Default: 0 + UDP variables: udp_mem - vector of 3 INTEGERs: min, pressure, max
include/linux/tcp.h +3 -1
@@ -104,6 +104,7 @@ enum {#define TCP_MD5SIG 14/* TCP MD5 Signature (RFC2385) */ #define TCP_COOKIE_TRANSACTIONS 15/* TCP Cookie Transactions */ #define TCP_THIN_LINEAR_TIMEOUTS 16/* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK 17/* Fast retrans. after 1 dupack */ /* for TCP_INFO socket option */ #define TCPI_OPT_TIMESTAMPS 1
@@ -343,7 +344,8 @@ struct tcp_sock {u8 frto_counter;/* Number of new acks after RTO */ u8 nonagle : 4,/* Disable Nagle algorithm? */ thin_lto : 1,/* Use linear timeouts for thin streams */ - unused : 3; + thin_dupack : 1,/* Fast retransmit on first dupack */ + unused : 2;/* RTT measurement */ u32 srtt;/* smoothed round trip time << 3 */
include/net/tcp.h +1 -0
@@ -245,6 +245,7 @@ extern int sysctl_tcp_slow_start_after_idle;extern int sysctl_tcp_max_ssthresh;extern int sysctl_tcp_cookie_size;extern int sysctl_tcp_thin_linear_timeouts; +extern int sysctl_tcp_thin_dupack;extern atomic_t tcp_memory_allocated;extern struct percpu_counter tcp_sockets_allocated;
net/ipv4/sysctl_net_ipv4.c +7 -0
@@ -582,6 +582,13 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "tcp_thin_dupack", + .data = &sysctl_tcp_thin_dupack, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, { .procname = "udp_mem", .data = &sysctl_udp_mem,
net/ipv4/tcp.c +7 -0
@@ -2236,6 +2236,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, tp->thin_lto = val;break ; +case TCP_THIN_DUPACK : +if (val <0 || val >1 ) + err = -EINVAL ; +else + tp->thin_dupack = val; +break ; +case TCP_CORK :/* When set indicates to always queue non-full frames. * Later the user clears this option and we transmit
net/ipv4/tcp_input.c +12 -0
@@ -89,6 +89,8 @@ int sysctl_tcp_frto __read_mostly = 2;int sysctl_tcp_frto_response__read_mostly ;int sysctl_tcp_nometrics_save__read_mostly ; +int sysctl_tcp_thin_dupack__read_mostly ; +int sysctl_tcp_moderate_rcvbuf__read_mostly =1 ;int sysctl_tcp_abc__read_mostly ;
@@ -2447,6 +2449,16 @@ static int tcp_time_to_recover(struct sock *sk)return 1 ; } +/* If a thin stream is detected, retransmit after first +* received dupack. Employ only if SACK is supported in order +* to avoid possible corner-case series of spurious retransmissions +* Use only if there are no unsent data. +*/ +if ((tp->thin_dupack || sysctl_tcp_thin_dupack) && +tcp_stream_is_thin (tp) &&tcp_dupack_heuristics (tp) >1 && +tcp_is_sack (tp) && !tcp_send_head (sk)) +return 1 ; +return 0 ; }
Signature · 1 line
1.6.3.3
David Miller
maintainerFrom: Andreas Petlund <[email protected]>
Date: Thu, 18 Feb 2010 13:42:13 +0100
Quoted 11 lines
This is a series of patches enabling non-intrusive, dynamically triggered modifications that improve retransmission latencies for thin streams.
The patch set was modified according to the feedback received.
Major change:
-Used bitfields to compact the nonagle variable
in thetcp_sockstruct. nonagle,thin_ltoandthin_dupackis now contained in the same u8.
Quoted 4 lines
I decided to use bitfields to handle this as it is already done similarly in the
tcp_options_receivedstruct.Also corrected some formatting issues.
All applied (I made sure the get the updated version of patch #3), thanks a lot!