tcp: add receive queue awareness in tcp_rcv_space_adjust()

If the application can not drain fast enough a TCP socket queue,
tcp_rcv_space_adjust() can overestimate tp->rcvq_space.space.

Then sk->sk_rcvbuf can grow and hit tcp_rmem[2] for no good reason.

Fix this by taking into acount the number of available bytes.

Keeping sk->sk_rcvbuf at the right size allows better cache efficiency.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Wei Wang <weiwan@google.com>
Link: https://patch.msgid.link/20250513193919.1089692-5-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Eric Dumazet
2025-05-13 19:39:12 +00:00
committed by Jakub Kicinski
parent 63ad7dfedf
commit ea33537d82
2 changed files with 5 additions and 3 deletions

View File

@@ -340,7 +340,7 @@ struct tcp_sock {
} rcv_rtt_est;
/* Receiver queue space */
struct {
u32 space;
int space;
u32 seq;
u64 time;
} rcvq_space;

View File

@@ -780,8 +780,7 @@ static void tcp_rcvbuf_grow(struct sock *sk)
void tcp_rcv_space_adjust(struct sock *sk)
{
struct tcp_sock *tp = tcp_sk(sk);
u32 copied;
int time;
int time, inq, copied;
trace_tcp_rcv_space_adjust(sk);
@@ -792,6 +791,9 @@ void tcp_rcv_space_adjust(struct sock *sk)
/* Number of bytes copied to user in last RTT */
copied = tp->copied_seq - tp->rcvq_space.seq;
/* Number of bytes in receive queue. */
inq = tp->rcv_nxt - tp->copied_seq;
copied -= inq;
if (copied <= tp->rcvq_space.space)
goto new_measure;