tcp: Namespace-ify sysctl_tcp_rmem and sysctl_tcp_wmem
Note that when a new netns is created, it inherits its sysctl_tcp_rmem and sysctl_tcp_wmem from initial netns. This change is needed so that we can refine TCP rcvbuf autotuning, to take RTT into consideration. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Wei Wang <weiwan@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a3dcaf17ee
commit
356d1833b6
@@ -320,7 +320,7 @@ static void tcp_sndbuf_expand(struct sock *sk)
|
||||
sndmem *= nr_segs * per_mss;
|
||||
|
||||
if (sk->sk_sndbuf < sndmem)
|
||||
sk->sk_sndbuf = min(sndmem, sysctl_tcp_wmem[2]);
|
||||
sk->sk_sndbuf = min(sndmem, sock_net(sk)->ipv4.sysctl_tcp_wmem[2]);
|
||||
}
|
||||
|
||||
/* 2. Tuning advertised window (window_clamp, rcv_ssthresh)
|
||||
@@ -354,7 +354,7 @@ static int __tcp_grow_window(const struct sock *sk, const struct sk_buff *skb)
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
/* Optimize this! */
|
||||
int truesize = tcp_win_from_space(sk, skb->truesize) >> 1;
|
||||
int window = tcp_win_from_space(sk, sysctl_tcp_rmem[2]) >> 1;
|
||||
int window = tcp_win_from_space(sk, sock_net(sk)->ipv4.sysctl_tcp_rmem[2]) >> 1;
|
||||
|
||||
while (tp->rcv_ssthresh <= window) {
|
||||
if (truesize <= skb->len)
|
||||
@@ -409,7 +409,7 @@ static void tcp_fixup_rcvbuf(struct sock *sk)
|
||||
rcvmem <<= 2;
|
||||
|
||||
if (sk->sk_rcvbuf < rcvmem)
|
||||
sk->sk_rcvbuf = min(rcvmem, sysctl_tcp_rmem[2]);
|
||||
sk->sk_rcvbuf = min(rcvmem, sock_net(sk)->ipv4.sysctl_tcp_rmem[2]);
|
||||
}
|
||||
|
||||
/* 4. Try to fixup all. It is made immediately after connection enters
|
||||
@@ -457,15 +457,16 @@ static void tcp_clamp_window(struct sock *sk)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct net *net = sock_net(sk);
|
||||
|
||||
icsk->icsk_ack.quick = 0;
|
||||
|
||||
if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] &&
|
||||
if (sk->sk_rcvbuf < net->ipv4.sysctl_tcp_rmem[2] &&
|
||||
!(sk->sk_userlocks & SOCK_RCVBUF_LOCK) &&
|
||||
!tcp_under_memory_pressure(sk) &&
|
||||
sk_memory_allocated(sk) < sk_prot_mem_limits(sk, 0)) {
|
||||
sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc),
|
||||
sysctl_tcp_rmem[2]);
|
||||
net->ipv4.sysctl_tcp_rmem[2]);
|
||||
}
|
||||
if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
|
||||
tp->rcv_ssthresh = min(tp->window_clamp, 2U * tp->advmss);
|
||||
@@ -623,7 +624,8 @@ void tcp_rcv_space_adjust(struct sock *sk)
|
||||
while (tcp_win_from_space(sk, rcvmem) < tp->advmss)
|
||||
rcvmem += 128;
|
||||
|
||||
rcvbuf = min(rcvwin / tp->advmss * rcvmem, sysctl_tcp_rmem[2]);
|
||||
rcvbuf = min(rcvwin / tp->advmss * rcvmem,
|
||||
sock_net(sk)->ipv4.sysctl_tcp_rmem[2]);
|
||||
if (rcvbuf > sk->sk_rcvbuf) {
|
||||
sk->sk_rcvbuf = rcvbuf;
|
||||
|
||||
|
Reference in New Issue
Block a user