mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
tcp: Combat per-cpu skew in orphan tests.
As reported by Anton Blanchard when we use percpu_counter_read_positive() to make our orphan socket limit checks, the check can be off by up to num_cpus_online() * batch (which is 32 by default) which on a 128 cpu machine can be as large as the default orphan limit itself. Fix this by doing the full expensive sum check if the optimized check triggers. Reported-by: Anton Blanchard <[email protected]> Signed-off-by: David S. Miller <[email protected]> Acked-by: Eric Dumazet <[email protected]>
This commit is contained in:
parent
b2bc85631e
commit
ad1af0fedb
3 changed files with 19 additions and 12 deletions
|
|
@ -2011,11 +2011,8 @@ adjudge_to_death:
|
|||
}
|
||||
}
|
||||
if (sk->sk_state != TCP_CLOSE) {
|
||||
int orphan_count = percpu_counter_read_positive(
|
||||
sk->sk_prot->orphan_count);
|
||||
|
||||
sk_mem_reclaim(sk);
|
||||
if (tcp_too_many_orphans(sk, orphan_count)) {
|
||||
if (tcp_too_many_orphans(sk, 0)) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_INFO "TCP: too many of orphaned "
|
||||
"sockets\n");
|
||||
|
|
|
|||
|
|
@ -66,18 +66,18 @@ static void tcp_write_err(struct sock *sk)
|
|||
static int tcp_out_of_resources(struct sock *sk, int do_reset)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int orphans = percpu_counter_read_positive(&tcp_orphan_count);
|
||||
int shift = 0;
|
||||
|
||||
/* If peer does not open window for long time, or did not transmit
|
||||
* anything for long time, penalize it. */
|
||||
if ((s32)(tcp_time_stamp - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset)
|
||||
orphans <<= 1;
|
||||
shift++;
|
||||
|
||||
/* If some dubious ICMP arrived, penalize even more. */
|
||||
if (sk->sk_err_soft)
|
||||
orphans <<= 1;
|
||||
shift++;
|
||||
|
||||
if (tcp_too_many_orphans(sk, orphans)) {
|
||||
if (tcp_too_many_orphans(sk, shift)) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_INFO "Out of socket memory\n");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue