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

[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
...@@ -759,6 +759,14 @@ static inline void sk_mem_reclaim(struct sock *sk) ...@@ -759,6 +759,14 @@ static inline void sk_mem_reclaim(struct sock *sk)
__sk_mem_reclaim(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) static inline void sk_mem_charge(struct sock *sk, int size)
{ {
if (!sk_has_account(sk)) if (!sk_has_account(sk))
......
...@@ -186,7 +186,7 @@ static void tcp_delack_timer(unsigned long data) ...@@ -186,7 +186,7 @@ static void tcp_delack_timer(unsigned long data)
goto out_unlock; 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)) if (sk->sk_state == TCP_CLOSE || !(icsk->icsk_ack.pending & ICSK_ACK_TIMER))
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment