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;
|
up->forward_deficit = 0;
|
||||||
|
|
||||||
atomic_sub(size, &sk->sk_rmem_alloc);
|
|
||||||
sk->sk_forward_alloc += size;
|
sk->sk_forward_alloc += size;
|
||||||
amt = (sk->sk_forward_alloc - partial) & ~(SK_MEM_QUANTUM - 1);
|
amt = (sk->sk_forward_alloc - partial) & ~(SK_MEM_QUANTUM - 1);
|
||||||
sk->sk_forward_alloc -= amt;
|
sk->sk_forward_alloc -= amt;
|
||||||
|
|
||||||
if (amt)
|
if (amt)
|
||||||
__sk_mem_reduce_allocated(sk, amt >> SK_MEM_QUANTUM_SHIFT);
|
__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.
|
/* Note: called with sk_receive_queue.lock held.
|
||||||
|
|
Loading…
Reference in New Issue