mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	geneve: update skb dst pmtu on tx path
Commit a93bf0ff44 ("vxlan: update skb dst pmtu on tx path") has fixed
a performance issue caused by the change of lower dev's mtu for vxlan.
The same thing needs to be done for geneve as well.
Note that geneve cannot adjust it's mtu according to lower dev's mtu
when creating it. The performance is very low later when netperfing
over it without fixing the mtu manually. This patch could also avoid
this issue.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									23263ec86a
								
							
						
					
					
						commit
						52a589d51f
					
				
					 1 changed files with 14 additions and 0 deletions
				
			
		| 
						 | 
					@ -825,6 +825,13 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
 | 
				
			||||||
	if (IS_ERR(rt))
 | 
						if (IS_ERR(rt))
 | 
				
			||||||
		return PTR_ERR(rt);
 | 
							return PTR_ERR(rt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (skb_dst(skb)) {
 | 
				
			||||||
 | 
							int mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr) -
 | 
				
			||||||
 | 
								  GENEVE_BASE_HLEN - info->options_len - 14;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
 | 
						sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
 | 
				
			||||||
	if (geneve->collect_md) {
 | 
						if (geneve->collect_md) {
 | 
				
			||||||
		tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
 | 
							tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
 | 
				
			||||||
| 
						 | 
					@ -864,6 +871,13 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
 | 
				
			||||||
	if (IS_ERR(dst))
 | 
						if (IS_ERR(dst))
 | 
				
			||||||
		return PTR_ERR(dst);
 | 
							return PTR_ERR(dst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (skb_dst(skb)) {
 | 
				
			||||||
 | 
							int mtu = dst_mtu(dst) - sizeof(struct ipv6hdr) -
 | 
				
			||||||
 | 
								  GENEVE_BASE_HLEN - info->options_len - 14;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
 | 
						sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
 | 
				
			||||||
	if (geneve->collect_md) {
 | 
						if (geneve->collect_md) {
 | 
				
			||||||
		prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
 | 
							prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue