Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9993e7d3 authored by David S. Miller's avatar David S. Miller
Browse files

[TCP]: Do not purge sk_forward_alloc entirely in tcp_delack_timer().



Otherwise we beat heavily on the global tcp_memory atomics
when all of the sockets in the system are slowly sending
perioding packet clumps.

Noticed and suggested by Eric Dumazet.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e186932b
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -759,6 +759,14 @@ static inline void sk_mem_reclaim(struct sock *sk)
		__sk_mem_reclaim(sk);
}

static inline void sk_mem_reclaim_partial(struct sock *sk)
{
	if (!sk_has_account(sk))
		return;
	if (sk->sk_forward_alloc > SK_MEM_QUANTUM)
		__sk_mem_reclaim(sk);
}

static inline void sk_mem_charge(struct sock *sk, int size)
{
	if (!sk_has_account(sk))
+1 −1
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ static void tcp_delack_timer(unsigned long data)
		goto out_unlock;
	}

	sk_mem_reclaim(sk);
	sk_mem_reclaim_partial(sk);

	if (sk->sk_state == TCP_CLOSE || !(icsk->icsk_ack.pending & ICSK_ACK_TIMER))
		goto out;