Commit ca057051 authored by Wei Wang's avatar Wei Wang Committed by David S. Miller

tcp: adjust sndbuf according to sk_reserved_mem

If user sets SO_RESERVE_MEM socket option, in order to fully utilize the
reserved memory in memory pressure state on the tx path, we modify the
logic in sk_stream_moderate_sndbuf() to set sk_sndbuf according to
available reserved memory, instead of MIN_SOCK_SNDBUF, and adjust it
when new data is acked.
Signed-off-by: default avatarWei Wang <weiwan@google.com>
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2bb2f5fb
...@@ -2378,6 +2378,7 @@ static inline void sk_stream_moderate_sndbuf(struct sock *sk) ...@@ -2378,6 +2378,7 @@ static inline void sk_stream_moderate_sndbuf(struct sock *sk)
return; return;
val = min(sk->sk_sndbuf, sk->sk_wmem_queued >> 1); val = min(sk->sk_sndbuf, sk->sk_wmem_queued >> 1);
val = max_t(u32, val, sk_unused_reserved_mem(sk));
WRITE_ONCE(sk->sk_sndbuf, max_t(u32, val, SOCK_MIN_SNDBUF)); WRITE_ONCE(sk->sk_sndbuf, max_t(u32, val, SOCK_MIN_SNDBUF));
} }
......
...@@ -5380,7 +5380,7 @@ static int tcp_prune_queue(struct sock *sk) ...@@ -5380,7 +5380,7 @@ static int tcp_prune_queue(struct sock *sk)
return -1; return -1;
} }
static bool tcp_should_expand_sndbuf(const struct sock *sk) static bool tcp_should_expand_sndbuf(struct sock *sk)
{ {
const struct tcp_sock *tp = tcp_sk(sk); const struct tcp_sock *tp = tcp_sk(sk);
...@@ -5391,8 +5391,18 @@ static bool tcp_should_expand_sndbuf(const struct sock *sk) ...@@ -5391,8 +5391,18 @@ static bool tcp_should_expand_sndbuf(const struct sock *sk)
return false; return false;
/* If we are under global TCP memory pressure, do not expand. */ /* If we are under global TCP memory pressure, do not expand. */
if (tcp_under_memory_pressure(sk)) if (tcp_under_memory_pressure(sk)) {
int unused_mem = sk_unused_reserved_mem(sk);
/* Adjust sndbuf according to reserved mem. But make sure
* it never goes below SOCK_MIN_SNDBUF.
* See sk_stream_moderate_sndbuf() for more details.
*/
if (unused_mem > SOCK_MIN_SNDBUF)
WRITE_ONCE(sk->sk_sndbuf, unused_mem);
return false; return false;
}
/* If we are under soft global TCP memory pressure, do not expand. */ /* If we are under soft global TCP memory pressure, do not expand. */
if (sk_memory_allocated(sk) >= sk_prot_mem_limits(sk, 0)) if (sk_memory_allocated(sk) >= sk_prot_mem_limits(sk, 0))
......
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