Commit ea33537d authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski
Browse files

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: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarWei Wang <weiwan@google.com>
Link: https://patch.msgid.link/20250513193919.1089692-5-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 63ad7dfe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -340,7 +340,7 @@ struct tcp_sock {
	} rcv_rtt_est;
/* Receiver queue space */
	struct {
		u32	space;
		int	space;
		u32	seq;
		u64	time;
	} rcvq_space;
+4 −2
Original line number Diff line number Diff line
@@ -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;