[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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e186932b3d
commit
9993e7d313
2 changed files with 9 additions and 1 deletions
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue