mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	tcp: switch to GSO being always on
Oleksandr Natalenko reported performance issues with BBR without FQ
packet scheduler that were root caused to lack of SG and GSO/TSO on
his configuration.
In this mode, TCP internal pacing has to setup a high resolution timer
for each MSS sent.
We could implement in TCP a strategy similar to the one adopted
in commit fefa569a9d ("net_sched: sch_fq: account for schedule/timers drifts")
or decide to finally switch TCP stack to a GSO only mode.
This has many benefits :
1) Most TCP developments are done with TSO in mind.
2) Less high-resolution timers needs to be armed for TCP-pacing
3) GSO can benefit of xmit_more hint
4) Receiver GRO is more effective (as if TSO was used for real on sender)
   -> Lower ACK traffic
5) Write queues have less overhead (one skb holds about 64KB of payload)
6) SACK coalescing just works.
7) rtx rb-tree contains less packets, SACK is cheaper.
This patch implements the minimum patch, but we can remove some legacy
code as follow ups.
Tested:
On 40Gbit link, one netperf -t TCP_STREAM
BBR+fq:
sg on:  26 Gbits/sec
sg off: 15.7 Gbits/sec   (was 2.3 Gbit before patch)
BBR+pfifo_fast:
sg on:  24.2 Gbits/sec
sg off: 14.9 Gbits/sec  (was 0.66 Gbit before patch !!! )
BBR+fq_codel:
sg on:  24.4 Gbits/sec
sg off: 15 Gbits/sec  (was 0.66 Gbit before patch !!! )
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									960103ff8d
								
							
						
					
					
						commit
						0a6b2a1dc2
					
				
					 3 changed files with 3 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -417,6 +417,7 @@ struct sock {
 | 
			
		|||
	struct page_frag	sk_frag;
 | 
			
		||||
	netdev_features_t	sk_route_caps;
 | 
			
		||||
	netdev_features_t	sk_route_nocaps;
 | 
			
		||||
	netdev_features_t	sk_route_forced_caps;
 | 
			
		||||
	int			sk_gso_type;
 | 
			
		||||
	unsigned int		sk_gso_max_size;
 | 
			
		||||
	gfp_t			sk_allocation;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1777,7 +1777,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
 | 
			
		|||
	u32 max_segs = 1;
 | 
			
		||||
 | 
			
		||||
	sk_dst_set(sk, dst);
 | 
			
		||||
	sk->sk_route_caps = dst->dev->features;
 | 
			
		||||
	sk->sk_route_caps = dst->dev->features | sk->sk_route_forced_caps;
 | 
			
		||||
	if (sk->sk_route_caps & NETIF_F_GSO)
 | 
			
		||||
		sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE;
 | 
			
		||||
	sk->sk_route_caps &= ~sk->sk_route_nocaps;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -453,6 +453,7 @@ void tcp_init_sock(struct sock *sk)
 | 
			
		|||
	sk->sk_rcvbuf = sock_net(sk)->ipv4.sysctl_tcp_rmem[1];
 | 
			
		||||
 | 
			
		||||
	sk_sockets_allocated_inc(sk);
 | 
			
		||||
	sk->sk_route_forced_caps = NETIF_F_GSO;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(tcp_init_sock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue