Loading include/net/tcp.h +15 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo); * most likely due to retrans in 3WHS. */ /* Number of full MSS to receive before Acking RFC2581 */ #define TCP_DELACK_SEG 1 #define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes * for local resources. */ Loading Loading @@ -274,6 +277,11 @@ extern int sysctl_tcp_pacing_ca_ratio; extern int sysctl_tcp_default_init_rwnd; extern atomic_long_t tcp_memory_allocated; /* sysctl variables for controlling various tcp parameters */ extern int sysctl_tcp_delack_seg; extern int sysctl_tcp_use_userconfig; extern struct percpu_counter tcp_sockets_allocated; extern int tcp_memory_pressure; Loading Loading @@ -364,6 +372,13 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags); /* sysctl master controller */ extern int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); extern int tcp_proc_delayed_ack_control(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); static inline void tcp_dec_quickack_mode(struct sock *sk, const unsigned int pkts) { Loading net/ipv4/sysctl_net_ipv4.c +23 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,10 @@ static int tcp_syn_retries_min = 1; static int tcp_syn_retries_max = MAX_TCP_SYNCNT; static int ip_ping_group_range_min[] = { 0, 0 }; static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; static int tcp_delack_seg_min = TCP_DELACK_MIN; static int tcp_delack_seg_max = 60; static int tcp_use_userconfig_min; static int tcp_use_userconfig_max = 1; /* Update system visible IP port range */ static void set_local_port_range(struct net *net, int range[2]) Loading Loading @@ -684,6 +688,25 @@ static struct ctl_table ipv4_table[] = { .proc_handler = proc_dointvec_minmax, .extra1 = &one }, { .procname = "tcp_delack_seg", .data = &sysctl_tcp_delack_seg, .maxlen = sizeof(sysctl_tcp_delack_seg), .mode = 0644, .proc_handler = tcp_proc_delayed_ack_control, .extra1 = &tcp_delack_seg_min, .extra2 = &tcp_delack_seg_max, }, { .procname = "tcp_use_userconfig", .data = &sysctl_tcp_use_userconfig, .maxlen = sizeof(sysctl_tcp_use_userconfig), .mode = 0644, .proc_handler = tcp_use_userconfig_sysctl_handler, .extra1 = &tcp_use_userconfig_min, .extra2 = &tcp_use_userconfig_max, }, { } }; Loading net/ipv4/tcp.c +11 −2 Original line number Diff line number Diff line Loading @@ -300,6 +300,12 @@ EXPORT_SYMBOL(sysctl_tcp_wmem); atomic_long_t tcp_memory_allocated; /* Current allocated memory. */ EXPORT_SYMBOL(tcp_memory_allocated); int sysctl_tcp_delack_seg __read_mostly = TCP_DELACK_SEG; EXPORT_SYMBOL(sysctl_tcp_delack_seg); int sysctl_tcp_use_userconfig __read_mostly; EXPORT_SYMBOL(sysctl_tcp_use_userconfig); /* * Current number of TCP sockets. */ Loading Loading @@ -1438,8 +1444,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied) /* Delayed ACKs frequently hit locked sockets during bulk * receive. */ if (icsk->icsk_ack.blocked || /* Once-per-two-segments ACK was not sent by tcp_input.c */ tp->rcv_nxt - tp->rcv_wup > icsk->icsk_ack.rcv_mss || /* Once-per-sysctl_tcp_delack_seg segments * ACK was not sent by tcp_input.c */ tp->rcv_nxt - tp->rcv_wup > (icsk->icsk_ack.rcv_mss) * sysctl_tcp_delack_seg || /* * If this read emptied read buffer, we send ACK, if * connection is not bidirectional, user drained Loading net/ipv4/tcp_input.c +2 −1 Original line number Diff line number Diff line Loading @@ -5104,7 +5104,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) struct tcp_sock *tp = tcp_sk(sk); /* More than one full frame received... */ if (((tp->rcv_nxt - tp->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss && if (((tp->rcv_nxt - tp->rcv_wup) > (inet_csk(sk)->icsk_ack.rcv_mss) * sysctl_tcp_delack_seg && /* ... and right edge of window advances far enough. * (tcp_recvmsg() will send ACK otherwise). Or... */ Loading net/ipv4/tcp_timer.c +33 −1 Original line number Diff line number Diff line Loading @@ -24,13 +24,45 @@ int sysctl_tcp_thin_linear_timeouts __read_mostly; static void set_tcp_default(void) { sysctl_tcp_delack_seg = TCP_DELACK_SEG; } /*sysctl handler for tcp_ack realted master control */ int tcp_proc_delayed_ack_control(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos) { int ret = proc_dointvec_minmax(table, write, buffer, length, ppos); /* The ret value will be 0 if the input validation is successful * and the values are written to sysctl table. If not, the stack * will continue to work with currently configured values */ return ret; } /*sysctl handler for tcp_ack realted master control */ int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos) { int ret = proc_dointvec_minmax(table, write, buffer, length, ppos); if (write && ret == 0) { if (!sysctl_tcp_use_userconfig) set_tcp_default(); } return ret; } /** * tcp_write_err() - close socket and save error info * @sk: The socket the error has appeared on. * * Returns: Nothing (void) */ static void tcp_write_err(struct sock *sk) { sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT; Loading Loading
include/net/tcp.h +15 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo); * most likely due to retrans in 3WHS. */ /* Number of full MSS to receive before Acking RFC2581 */ #define TCP_DELACK_SEG 1 #define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes * for local resources. */ Loading Loading @@ -274,6 +277,11 @@ extern int sysctl_tcp_pacing_ca_ratio; extern int sysctl_tcp_default_init_rwnd; extern atomic_long_t tcp_memory_allocated; /* sysctl variables for controlling various tcp parameters */ extern int sysctl_tcp_delack_seg; extern int sysctl_tcp_use_userconfig; extern struct percpu_counter tcp_sockets_allocated; extern int tcp_memory_pressure; Loading Loading @@ -364,6 +372,13 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags); /* sysctl master controller */ extern int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); extern int tcp_proc_delayed_ack_control(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); static inline void tcp_dec_quickack_mode(struct sock *sk, const unsigned int pkts) { Loading
net/ipv4/sysctl_net_ipv4.c +23 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,10 @@ static int tcp_syn_retries_min = 1; static int tcp_syn_retries_max = MAX_TCP_SYNCNT; static int ip_ping_group_range_min[] = { 0, 0 }; static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; static int tcp_delack_seg_min = TCP_DELACK_MIN; static int tcp_delack_seg_max = 60; static int tcp_use_userconfig_min; static int tcp_use_userconfig_max = 1; /* Update system visible IP port range */ static void set_local_port_range(struct net *net, int range[2]) Loading Loading @@ -684,6 +688,25 @@ static struct ctl_table ipv4_table[] = { .proc_handler = proc_dointvec_minmax, .extra1 = &one }, { .procname = "tcp_delack_seg", .data = &sysctl_tcp_delack_seg, .maxlen = sizeof(sysctl_tcp_delack_seg), .mode = 0644, .proc_handler = tcp_proc_delayed_ack_control, .extra1 = &tcp_delack_seg_min, .extra2 = &tcp_delack_seg_max, }, { .procname = "tcp_use_userconfig", .data = &sysctl_tcp_use_userconfig, .maxlen = sizeof(sysctl_tcp_use_userconfig), .mode = 0644, .proc_handler = tcp_use_userconfig_sysctl_handler, .extra1 = &tcp_use_userconfig_min, .extra2 = &tcp_use_userconfig_max, }, { } }; Loading
net/ipv4/tcp.c +11 −2 Original line number Diff line number Diff line Loading @@ -300,6 +300,12 @@ EXPORT_SYMBOL(sysctl_tcp_wmem); atomic_long_t tcp_memory_allocated; /* Current allocated memory. */ EXPORT_SYMBOL(tcp_memory_allocated); int sysctl_tcp_delack_seg __read_mostly = TCP_DELACK_SEG; EXPORT_SYMBOL(sysctl_tcp_delack_seg); int sysctl_tcp_use_userconfig __read_mostly; EXPORT_SYMBOL(sysctl_tcp_use_userconfig); /* * Current number of TCP sockets. */ Loading Loading @@ -1438,8 +1444,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied) /* Delayed ACKs frequently hit locked sockets during bulk * receive. */ if (icsk->icsk_ack.blocked || /* Once-per-two-segments ACK was not sent by tcp_input.c */ tp->rcv_nxt - tp->rcv_wup > icsk->icsk_ack.rcv_mss || /* Once-per-sysctl_tcp_delack_seg segments * ACK was not sent by tcp_input.c */ tp->rcv_nxt - tp->rcv_wup > (icsk->icsk_ack.rcv_mss) * sysctl_tcp_delack_seg || /* * If this read emptied read buffer, we send ACK, if * connection is not bidirectional, user drained Loading
net/ipv4/tcp_input.c +2 −1 Original line number Diff line number Diff line Loading @@ -5104,7 +5104,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) struct tcp_sock *tp = tcp_sk(sk); /* More than one full frame received... */ if (((tp->rcv_nxt - tp->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss && if (((tp->rcv_nxt - tp->rcv_wup) > (inet_csk(sk)->icsk_ack.rcv_mss) * sysctl_tcp_delack_seg && /* ... and right edge of window advances far enough. * (tcp_recvmsg() will send ACK otherwise). Or... */ Loading
net/ipv4/tcp_timer.c +33 −1 Original line number Diff line number Diff line Loading @@ -24,13 +24,45 @@ int sysctl_tcp_thin_linear_timeouts __read_mostly; static void set_tcp_default(void) { sysctl_tcp_delack_seg = TCP_DELACK_SEG; } /*sysctl handler for tcp_ack realted master control */ int tcp_proc_delayed_ack_control(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos) { int ret = proc_dointvec_minmax(table, write, buffer, length, ppos); /* The ret value will be 0 if the input validation is successful * and the values are written to sysctl table. If not, the stack * will continue to work with currently configured values */ return ret; } /*sysctl handler for tcp_ack realted master control */ int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos) { int ret = proc_dointvec_minmax(table, write, buffer, length, ppos); if (write && ret == 0) { if (!sysctl_tcp_use_userconfig) set_tcp_default(); } return ret; } /** * tcp_write_err() - close socket and save error info * @sk: The socket the error has appeared on. * * Returns: Nothing (void) */ static void tcp_write_err(struct sock *sk) { sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT; Loading