mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 07:04:24 +00:00
net: refine {udp|tcp|sctp}_mem limits
Current tcp/udp/sctp global memory limits are not taking into account hugepages allocations, and allow 50% of ram to be used by buffers of a single protocol [ not counting space used by sockets / inodes ...] Lets use nr_free_buffer_pages() and allow a default of 1/8 of kernel ram per protocol, and a minimum of 128 pages. Heavy duty machines sysadmins probably need to tweak limits anyway. References: https://bugzilla.stlinux.com/show_bug.cgi?id=38032 Reported-by: starlight <starlight@binnacle.cx> Suggested-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
eebb02b1f0
commit
f03d78db65
3 changed files with 5 additions and 26 deletions
|
@ -3220,7 +3220,7 @@ __setup("thash_entries=", set_thash_entries);
|
||||||
void __init tcp_init(void)
|
void __init tcp_init(void)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
unsigned long nr_pages, limit;
|
unsigned long limit;
|
||||||
int i, max_share, cnt;
|
int i, max_share, cnt;
|
||||||
unsigned long jiffy = jiffies;
|
unsigned long jiffy = jiffies;
|
||||||
|
|
||||||
|
@ -3277,13 +3277,7 @@ void __init tcp_init(void)
|
||||||
sysctl_tcp_max_orphans = cnt / 2;
|
sysctl_tcp_max_orphans = cnt / 2;
|
||||||
sysctl_max_syn_backlog = max(128, cnt / 256);
|
sysctl_max_syn_backlog = max(128, cnt / 256);
|
||||||
|
|
||||||
/* Set the pressure threshold to be a fraction of global memory that
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of
|
|
||||||
* memory, with a floor of 128 pages.
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_tcp_mem[0] = limit / 4 * 3;
|
sysctl_tcp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_tcp_mem[1] = limit;
|
sysctl_tcp_mem[1] = limit;
|
||||||
|
|
|
@ -2209,16 +2209,10 @@ void __init udp_table_init(struct udp_table *table, const char *name)
|
||||||
|
|
||||||
void __init udp_init(void)
|
void __init udp_init(void)
|
||||||
{
|
{
|
||||||
unsigned long nr_pages, limit;
|
unsigned long limit;
|
||||||
|
|
||||||
udp_table_init(&udp_table, "UDP");
|
udp_table_init(&udp_table, "UDP");
|
||||||
/* Set the pressure threshold up by the same strategy of TCP. It is a
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* fraction of global memory that is up to 1/2 at 256 MB, decreasing
|
|
||||||
* toward zero with the amount of memory, with a floor of 128 pages.
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_udp_mem[0] = limit / 4 * 3;
|
sysctl_udp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_udp_mem[1] = limit;
|
sysctl_udp_mem[1] = limit;
|
||||||
|
|
|
@ -1058,7 +1058,6 @@ SCTP_STATIC __init int sctp_init(void)
|
||||||
int status = -EINVAL;
|
int status = -EINVAL;
|
||||||
unsigned long goal;
|
unsigned long goal;
|
||||||
unsigned long limit;
|
unsigned long limit;
|
||||||
unsigned long nr_pages;
|
|
||||||
int max_share;
|
int max_share;
|
||||||
int order;
|
int order;
|
||||||
|
|
||||||
|
@ -1148,15 +1147,7 @@ SCTP_STATIC __init int sctp_init(void)
|
||||||
/* Initialize handle used for association ids. */
|
/* Initialize handle used for association ids. */
|
||||||
idr_init(&sctp_assocs_id);
|
idr_init(&sctp_assocs_id);
|
||||||
|
|
||||||
/* Set the pressure threshold to be a fraction of global memory that
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of
|
|
||||||
* memory, with a floor of 128 pages.
|
|
||||||
* Note this initializes the data in sctpv6_prot too
|
|
||||||
* Unabashedly stolen from tcp_init
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_sctp_mem[0] = limit / 4 * 3;
|
sysctl_sctp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_sctp_mem[1] = limit;
|
sysctl_sctp_mem[1] = limit;
|
||||||
|
|
Loading…
Reference in a new issue