udp: udp_rmem_release() should touch sk_rmem_alloc later
In flood situations, keeping sk_rmem_alloc at a high value prevents producers from touching the socket. It makes sense to lower sk_rmem_alloc only at the end of udp_rmem_release() after the thread draining receive queue in udp_recvmsg() finished the writes to sk_forward_alloc. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6b229cf77d
commit
02ab0d139c
|
@ -1191,13 +1191,14 @@ static void udp_rmem_release(struct sock *sk, int size, int partial)
|
|||
}
|
||||
up->forward_deficit = 0;
|
||||
|
||||
atomic_sub(size, &sk->sk_rmem_alloc);
|
||||
sk->sk_forward_alloc += size;
|
||||
amt = (sk->sk_forward_alloc - partial) & ~(SK_MEM_QUANTUM - 1);
|
||||
sk->sk_forward_alloc -= amt;
|
||||
|
||||
if (amt)
|
||||
__sk_mem_reduce_allocated(sk, amt >> SK_MEM_QUANTUM_SHIFT);
|
||||
|
||||
atomic_sub(size, &sk->sk_rmem_alloc);
|
||||
}
|
||||
|
||||
/* Note: called with sk_receive_queue.lock held.
|
||||
|
|
Loading…
Reference in New Issue