|
@@ -1876,6 +1876,20 @@ void tcp_shutdown(struct sock *sk, int how)
|
|
|
}
|
|
|
EXPORT_SYMBOL(tcp_shutdown);
|
|
|
|
|
|
+bool tcp_check_oom(struct sock *sk, int shift)
|
|
|
+{
|
|
|
+ bool too_many_orphans, out_of_socket_memory;
|
|
|
+
|
|
|
+ too_many_orphans = tcp_too_many_orphans(sk, shift);
|
|
|
+ out_of_socket_memory = tcp_out_of_memory(sk);
|
|
|
+
|
|
|
+ if (too_many_orphans && net_ratelimit())
|
|
|
+ pr_info("TCP: too many orphaned sockets\n");
|
|
|
+ if (out_of_socket_memory && net_ratelimit())
|
|
|
+ pr_info("TCP: out of memory -- consider tuning tcp_mem\n");
|
|
|
+ return too_many_orphans || out_of_socket_memory;
|
|
|
+}
|
|
|
+
|
|
|
void tcp_close(struct sock *sk, long timeout)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
@@ -2015,10 +2029,7 @@ adjudge_to_death:
|
|
|
}
|
|
|
if (sk->sk_state != TCP_CLOSE) {
|
|
|
sk_mem_reclaim(sk);
|
|
|
- if (tcp_too_many_orphans(sk, 0)) {
|
|
|
- if (net_ratelimit())
|
|
|
- printk(KERN_INFO "TCP: too many of orphaned "
|
|
|
- "sockets\n");
|
|
|
+ if (tcp_check_oom(sk, 0)) {
|
|
|
tcp_set_state(sk, TCP_CLOSE);
|
|
|
tcp_send_active_reset(sk, GFP_ATOMIC);
|
|
|
NET_INC_STATS_BH(sock_net(sk),
|