ANDROID: net: ipv4: tcp: add a sysctl to config the tcp_default_init_rwnd
The default initial rwnd is hardcoded to 10. Now we allow it to be controlled via /proc/sys/net/ipv4/tcp_default_init_rwnd which limits the values from 3 to 100 This is somewhat needed because ipv6 routes are autoconfigured by the kernel. See "An Argument for Increasing TCP's Initial Congestion Window" in https://developers.google.com/speed/articles/tcp_initcwnd_paper.pdf Change-Id: I386b2a9d62de0ebe05c1ebe1b4bd91b314af5c54 Signed-off-by: JP Abgrall <jpa@google.com> Conflicts: net/ipv4/sysctl_net_ipv4.c net/ipv4/tcp_input.c [AmitP: Folded following android-4.9 commit changes into this patch 3823c8b26e6e ("ANDROID: tcp: fix tcp_default_init_rwnd() for 4.1")] Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
This commit is contained in:
parent
8f414ea43f
commit
89e8c70306
4 changed files with 26 additions and 1 deletions
|
@ -248,6 +248,8 @@ extern long sysctl_tcp_mem[3];
|
||||||
#define TCP_RACK_STATIC_REO_WND 0x2 /* Use static RACK reo wnd */
|
#define TCP_RACK_STATIC_REO_WND 0x2 /* Use static RACK reo wnd */
|
||||||
#define TCP_RACK_NO_DUPTHRESH 0x4 /* Do not use DUPACK threshold in RACK */
|
#define TCP_RACK_NO_DUPTHRESH 0x4 /* Do not use DUPACK threshold in RACK */
|
||||||
|
|
||||||
|
extern int sysctl_tcp_default_init_rwnd;
|
||||||
|
|
||||||
extern atomic_long_t tcp_memory_allocated;
|
extern atomic_long_t tcp_memory_allocated;
|
||||||
extern struct percpu_counter tcp_sockets_allocated;
|
extern struct percpu_counter tcp_sockets_allocated;
|
||||||
extern unsigned long tcp_memory_pressure;
|
extern unsigned long tcp_memory_pressure;
|
||||||
|
|
|
@ -218,6 +218,21 @@ static int ipv4_fwd_update_priority(struct ctl_table *table, int write,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Validate changes from /proc interface. */
|
||||||
|
static int proc_tcp_default_init_rwnd(struct ctl_table *ctl, int write,
|
||||||
|
void __user *buffer,
|
||||||
|
size_t *lenp, loff_t *ppos)
|
||||||
|
{
|
||||||
|
int old_value = *(int *)ctl->data;
|
||||||
|
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
|
||||||
|
int new_value = *(int *)ctl->data;
|
||||||
|
|
||||||
|
if (write && ret == 0 && (new_value < 3 || new_value > 100))
|
||||||
|
*(int *)ctl->data = old_value;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
|
static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
|
||||||
void __user *buffer, size_t *lenp, loff_t *ppos)
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
|
@ -525,6 +540,13 @@ static struct ctl_table ipv4_table[] = {
|
||||||
.mode = 0444,
|
.mode = 0444,
|
||||||
.proc_handler = proc_tcp_available_ulp,
|
.proc_handler = proc_tcp_available_ulp,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.procname = "tcp_default_init_rwnd",
|
||||||
|
.data = &sysctl_tcp_default_init_rwnd,
|
||||||
|
.maxlen = sizeof(int),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = proc_tcp_default_init_rwnd
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.procname = "icmp_msgs_per_sec",
|
.procname = "icmp_msgs_per_sec",
|
||||||
.data = &sysctl_icmp_msgs_per_sec,
|
.data = &sysctl_icmp_msgs_per_sec,
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
#include <net/busy_poll.h>
|
#include <net/busy_poll.h>
|
||||||
|
|
||||||
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
||||||
|
int sysctl_tcp_default_init_rwnd __read_mostly = TCP_INIT_CWND * 2;
|
||||||
|
|
||||||
#define FLAG_DATA 0x01 /* Incoming frame contained data. */
|
#define FLAG_DATA 0x01 /* Incoming frame contained data. */
|
||||||
#define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */
|
#define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */
|
||||||
|
|
|
@ -187,7 +187,7 @@ u32 tcp_default_init_rwnd(u32 mss)
|
||||||
* (RFC 3517, Section 4, NextSeg() rule (2)). Further place a
|
* (RFC 3517, Section 4, NextSeg() rule (2)). Further place a
|
||||||
* limit when mss is larger than 1460.
|
* limit when mss is larger than 1460.
|
||||||
*/
|
*/
|
||||||
u32 init_rwnd = TCP_INIT_CWND * 2;
|
u32 init_rwnd = sysctl_tcp_default_init_rwnd;
|
||||||
|
|
||||||
if (mss > 1460)
|
if (mss > 1460)
|
||||||
init_rwnd = max((1460 * init_rwnd) / mss, 2U);
|
init_rwnd = max((1460 * init_rwnd) / mss, 2U);
|
||||||
|
|
Loading…
Reference in a new issue