]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
tcp: allow one skb to be received per socket under memory pressure
authorEric Dumazet <edumazet@google.com>
Fri, 15 May 2015 19:39:29 +0000 (12:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 May 2015 02:45:49 +0000 (22:45 -0400)
While testing tight tcp_mem settings, I found tcp sessions could be
stuck because we do not allow even one skb to be received on them.

By allowing one skb to be received, we introduce fairness and
eventuallu force memory hogs to release their allocation.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c

index 093779f7e8930dad58aa60c00f6a1225c4cc20e2..40c435997e54eb400fd9d9da054e973ee9ca0ba9 100644 (file)
@@ -4507,10 +4507,12 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
 
                if (eaten <= 0) {
 queue_and_out:
-                       if (eaten < 0 &&
-                           tcp_try_rmem_schedule(sk, skb, skb->truesize))
-                               goto drop;
-
+                       if (eaten < 0) {
+                               if (skb_queue_len(&sk->sk_receive_queue) == 0)
+                                       sk_forced_mem_schedule(sk, skb->truesize);
+                               else if (tcp_try_rmem_schedule(sk, skb, skb->truesize))
+                                       goto drop;
+                       }
                        eaten = tcp_queue_rcv(sk, skb, 0, &fragstolen);
                }
                tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq);