]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tcp: adjust sndbuf according to sk_reserved_mem
authorWei Wang <weiwan@google.com>
Wed, 29 Sep 2021 17:25:12 +0000 (10:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Sep 2021 12:36:46 +0000 (13:36 +0100)
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: Wei Wang <weiwan@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h
net/ipv4/tcp_input.c

index 447fddb384a41b45d44fef00bd920bcae126fc3a..c3af696258feba175bb9bf074e548976c10586b8 100644 (file)
@@ -2378,6 +2378,7 @@ static inline void sk_stream_moderate_sndbuf(struct sock *sk)
                return;
 
        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));
 }
index 53675e284841104be34c2415cbe7fe138683a466..06020395cc8d0a631813937d498a211f14777a69 100644 (file)
@@ -5380,7 +5380,7 @@ static int tcp_prune_queue(struct sock *sk)
        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);
 
@@ -5391,8 +5391,18 @@ static bool tcp_should_expand_sndbuf(const struct sock *sk)
                return false;
 
        /* 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;
+       }
 
        /* If we are under soft global TCP memory pressure, do not expand.  */
        if (sk_memory_allocated(sk) >= sk_prot_mem_limits(sk, 0))