Commit c5ed63d6 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

tcp: fix three tcp sysctls tuning

As discovered by Anton Blanchard, current code to autotune 
tcp_death_row.sysctl_max_tw_buckets, sysctl_tcp_max_orphans and
sysctl_max_syn_backlog makes little sense.

The bigger a page is, the less tcp_max_orphans is : 4096 on a 512GB
machine in Anton's case.

(tcp_hashinfo.bhash_size * sizeof(struct inet_bind_hashbucket))
is much bigger if spinlock debugging is on. Its wrong to select bigger
limits in this case (where kernel structures are also bigger)

bhash_size max is 65536, and we get this value even for small machines. 

A better ground is to use size of ehash table, this also makes code
shorter and more obvious.

Based on a patch from Anton, and another from David.
Reported-and-tested-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ad1af0fe
...@@ -3209,7 +3209,7 @@ void __init tcp_init(void) ...@@ -3209,7 +3209,7 @@ void __init tcp_init(void)
{ {
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
unsigned long nr_pages, limit; unsigned long nr_pages, limit;
int order, i, max_share; int i, max_share, cnt;
unsigned long jiffy = jiffies; unsigned long jiffy = jiffies;
BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb));
...@@ -3258,22 +3258,12 @@ void __init tcp_init(void) ...@@ -3258,22 +3258,12 @@ void __init tcp_init(void)
INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain); INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain);
} }
/* Try to be a bit smarter and adjust defaults depending
* on available memory. cnt = tcp_hashinfo.ehash_mask + 1;
*/
for (order = 0; ((1 << order) << PAGE_SHIFT) < tcp_death_row.sysctl_max_tw_buckets = cnt / 2;
(tcp_hashinfo.bhash_size * sizeof(struct inet_bind_hashbucket)); sysctl_tcp_max_orphans = cnt / 2;
order++) sysctl_max_syn_backlog = max(128, cnt / 256);
;
if (order >= 4) {
tcp_death_row.sysctl_max_tw_buckets = 180000;
sysctl_tcp_max_orphans = 4096 << (order - 4);
sysctl_max_syn_backlog = 1024;
} else if (order < 3) {
tcp_death_row.sysctl_max_tw_buckets >>= (3 - order);
sysctl_tcp_max_orphans >>= (3 - order);
sysctl_max_syn_backlog = 128;
}
/* Set the pressure threshold to be a fraction of global memory that /* Set the pressure threshold to be a fraction of global memory that
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of * is up to 1/2 at 256 MB, decreasing toward zero with the amount of
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment