diff options
Diffstat (limited to 'include/net/tcp.h')
| -rw-r--r-- | include/net/tcp.h | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/include/net/tcp.h b/include/net/tcp.h index df6a2eb2019..eaa9582779d 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -268,11 +268,21 @@ static inline int between(__u32 seq1, __u32 seq2, __u32 seq3)  	return seq3 - seq2 >= seq1 - seq2;  } -static inline int tcp_too_many_orphans(struct sock *sk, int num) +static inline bool tcp_too_many_orphans(struct sock *sk, int shift)  { -	return (num > sysctl_tcp_max_orphans) || -		(sk->sk_wmem_queued > SOCK_MIN_SNDBUF && -		 atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]); +	struct percpu_counter *ocp = sk->sk_prot->orphan_count; +	int orphans = percpu_counter_read_positive(ocp); + +	if (orphans << shift > sysctl_tcp_max_orphans) { +		orphans = percpu_counter_sum_positive(ocp); +		if (orphans << shift > sysctl_tcp_max_orphans) +			return true; +	} + +	if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && +	    atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) +		return true; +	return false;  }  /* syncookies: remember time of last synqueue overflow */ | 
