mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
net: avoid limits overflow
Robin Holt tried to boot a 16TB machine and found some limits were reached : sysctl_tcp_mem[2], sysctl_udp_mem[2] We can switch infrastructure to use long "instead" of "int", now atomic_long_t primitives are available for free. Signed-off-by: Eric Dumazet <[email protected]> Reported-by: Robin Holt <[email protected]> Reviewed-by: Robin Holt <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
67286640f6
commit
8d987e5c75
15 changed files with 40 additions and 38 deletions
|
|
@ -59,13 +59,13 @@ static int sockstat_seq_show(struct seq_file *seq, void *v)
|
|||
local_bh_enable();
|
||||
|
||||
socket_seq_show(seq);
|
||||
seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %d\n",
|
||||
seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %ld\n",
|
||||
sock_prot_inuse_get(net, &tcp_prot), orphans,
|
||||
tcp_death_row.tw_count, sockets,
|
||||
atomic_read(&tcp_memory_allocated));
|
||||
seq_printf(seq, "UDP: inuse %d mem %d\n",
|
||||
atomic_long_read(&tcp_memory_allocated));
|
||||
seq_printf(seq, "UDP: inuse %d mem %ld\n",
|
||||
sock_prot_inuse_get(net, &udp_prot),
|
||||
atomic_read(&udp_memory_allocated));
|
||||
atomic_long_read(&udp_memory_allocated));
|
||||
seq_printf(seq, "UDPLITE: inuse %d\n",
|
||||
sock_prot_inuse_get(net, &udplite_prot));
|
||||
seq_printf(seq, "RAW: inuse %d\n",
|
||||
|
|
|
|||
|
|
@ -398,7 +398,7 @@ static struct ctl_table ipv4_table[] = {
|
|||
.data = &sysctl_tcp_mem,
|
||||
.maxlen = sizeof(sysctl_tcp_mem),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
.proc_handler = proc_doulongvec_minmax
|
||||
},
|
||||
{
|
||||
.procname = "tcp_wmem",
|
||||
|
|
@ -602,8 +602,7 @@ static struct ctl_table ipv4_table[] = {
|
|||
.data = &sysctl_udp_mem,
|
||||
.maxlen = sizeof(sysctl_udp_mem),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = &zero
|
||||
.proc_handler = proc_doulongvec_minmax,
|
||||
},
|
||||
{
|
||||
.procname = "udp_rmem_min",
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT;
|
|||
struct percpu_counter tcp_orphan_count;
|
||||
EXPORT_SYMBOL_GPL(tcp_orphan_count);
|
||||
|
||||
int sysctl_tcp_mem[3] __read_mostly;
|
||||
long sysctl_tcp_mem[3] __read_mostly;
|
||||
int sysctl_tcp_wmem[3] __read_mostly;
|
||||
int sysctl_tcp_rmem[3] __read_mostly;
|
||||
|
||||
|
|
@ -290,7 +290,7 @@ EXPORT_SYMBOL(sysctl_tcp_mem);
|
|||
EXPORT_SYMBOL(sysctl_tcp_rmem);
|
||||
EXPORT_SYMBOL(sysctl_tcp_wmem);
|
||||
|
||||
atomic_t tcp_memory_allocated; /* Current allocated memory. */
|
||||
atomic_long_t tcp_memory_allocated; /* Current allocated memory. */
|
||||
EXPORT_SYMBOL(tcp_memory_allocated);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -259,8 +259,11 @@ static void tcp_fixup_sndbuf(struct sock *sk)
|
|||
int sndmem = tcp_sk(sk)->rx_opt.mss_clamp + MAX_TCP_HEADER + 16 +
|
||||
sizeof(struct sk_buff);
|
||||
|
||||
if (sk->sk_sndbuf < 3 * sndmem)
|
||||
sk->sk_sndbuf = min(3 * sndmem, sysctl_tcp_wmem[2]);
|
||||
if (sk->sk_sndbuf < 3 * sndmem) {
|
||||
sk->sk_sndbuf = 3 * sndmem;
|
||||
if (sk->sk_sndbuf > sysctl_tcp_wmem[2])
|
||||
sk->sk_sndbuf = sysctl_tcp_wmem[2];
|
||||
}
|
||||
}
|
||||
|
||||
/* 2. Tuning advertised window (window_clamp, rcv_ssthresh)
|
||||
|
|
@ -396,7 +399,7 @@ static void tcp_clamp_window(struct sock *sk)
|
|||
if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] &&
|
||||
!(sk->sk_userlocks & SOCK_RCVBUF_LOCK) &&
|
||||
!tcp_memory_pressure &&
|
||||
atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) {
|
||||
atomic_long_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) {
|
||||
sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc),
|
||||
sysctl_tcp_rmem[2]);
|
||||
}
|
||||
|
|
@ -4861,7 +4864,7 @@ static int tcp_should_expand_sndbuf(struct sock *sk)
|
|||
return 0;
|
||||
|
||||
/* If we are under soft global TCP memory pressure, do not expand. */
|
||||
if (atomic_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0])
|
||||
if (atomic_long_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0])
|
||||
return 0;
|
||||
|
||||
/* If we filled the congestion window, do not expand. */
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@
|
|||
struct udp_table udp_table __read_mostly;
|
||||
EXPORT_SYMBOL(udp_table);
|
||||
|
||||
int sysctl_udp_mem[3] __read_mostly;
|
||||
long sysctl_udp_mem[3] __read_mostly;
|
||||
EXPORT_SYMBOL(sysctl_udp_mem);
|
||||
|
||||
int sysctl_udp_rmem_min __read_mostly;
|
||||
|
|
@ -119,7 +119,7 @@ EXPORT_SYMBOL(sysctl_udp_rmem_min);
|
|||
int sysctl_udp_wmem_min __read_mostly;
|
||||
EXPORT_SYMBOL(sysctl_udp_wmem_min);
|
||||
|
||||
atomic_t udp_memory_allocated;
|
||||
atomic_long_t udp_memory_allocated;
|
||||
EXPORT_SYMBOL(udp_memory_allocated);
|
||||
|
||||
#define MAX_UDP_PORTS 65536
|
||||
|
|
|
|||
Loading…
Reference in a new issue