mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	tcp: allow one skb to be received per socket under memory pressure
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>
This commit is contained in:
		
							parent
							
								
									8e4d980ac2
								
							
						
					
					
						commit
						76dfa60820
					
				
					 1 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
					@ -4507,10 +4507,12 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (eaten <= 0) {
 | 
							if (eaten <= 0) {
 | 
				
			||||||
queue_and_out:
 | 
					queue_and_out:
 | 
				
			||||||
			if (eaten < 0 &&
 | 
								if (eaten < 0) {
 | 
				
			||||||
			    tcp_try_rmem_schedule(sk, skb, skb->truesize))
 | 
									if (skb_queue_len(&sk->sk_receive_queue) == 0)
 | 
				
			||||||
				goto drop;
 | 
										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);
 | 
								eaten = tcp_queue_rcv(sk, skb, 0, &fragstolen);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq);
 | 
							tcp_rcv_nxt_update(tp, TCP_SKB_CB(skb)->end_seq);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue