mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	vxlan: GRO support at tunnel layer
Add calls to gro_cells infrastructure to do GRO when receiving on a tunnel.
Testing:
Ran 200 netperf TCP_STREAM instance
  - With fix (GRO enabled on VXLAN interface)
    Verify GRO is happening.
    9084 MBps tput
    3.44% CPU utilization
  - Without fix (GRO disabled on VXLAN interface)
    Verified no GRO is happening.
    9084 MBps tput
    5.54% CPU utilization
Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									b7fe10e5eb
								
							
						
					
					
						commit
						58ce31cca1
					
				
					 2 changed files with 8 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1208,7 +1208,7 @@ static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb,
 | 
			
		|||
	stats->rx_bytes += skb->len;
 | 
			
		||||
	u64_stats_update_end(&stats->syncp);
 | 
			
		||||
 | 
			
		||||
	netif_rx(skb);
 | 
			
		||||
	gro_cells_receive(&vxlan->gro_cells, skb);
 | 
			
		||||
 | 
			
		||||
	return;
 | 
			
		||||
drop:
 | 
			
		||||
| 
						 | 
				
			
			@ -2446,6 +2446,8 @@ static void vxlan_setup(struct net_device *dev)
 | 
			
		|||
 | 
			
		||||
	vxlan->dev = dev;
 | 
			
		||||
 | 
			
		||||
	gro_cells_init(&vxlan->gro_cells, dev);
 | 
			
		||||
 | 
			
		||||
	for (h = 0; h < FDB_HASH_SIZE; ++h)
 | 
			
		||||
		INIT_HLIST_HEAD(&vxlan->fdb_head[h]);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2885,6 +2887,7 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)
 | 
			
		|||
		hlist_del_rcu(&vxlan->hlist);
 | 
			
		||||
	spin_unlock(&vn->sock_lock);
 | 
			
		||||
 | 
			
		||||
	gro_cells_destroy(&vxlan->gro_cells);
 | 
			
		||||
	list_del(&vxlan->next);
 | 
			
		||||
	unregister_netdevice_queue(dev, head);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3093,8 +3096,10 @@ static void __net_exit vxlan_exit_net(struct net *net)
 | 
			
		|||
		/* If vxlan->dev is in the same netns, it has already been added
 | 
			
		||||
		 * to the list by the previous loop.
 | 
			
		||||
		 */
 | 
			
		||||
		if (!net_eq(dev_net(vxlan->dev), net))
 | 
			
		||||
		if (!net_eq(dev_net(vxlan->dev), net)) {
 | 
			
		||||
			gro_cells_destroy(&vxlan->gro_cells);
 | 
			
		||||
			unregister_netdevice_queue(vxlan->dev, &list);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	unregister_netdevice_many(&list);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -161,6 +161,7 @@ struct vxlan_dev {
 | 
			
		|||
	struct timer_list age_timer;
 | 
			
		||||
	spinlock_t	  hash_lock;
 | 
			
		||||
	unsigned int	  addrcnt;
 | 
			
		||||
	struct gro_cells  gro_cells;
 | 
			
		||||
 | 
			
		||||
	struct vxlan_config	cfg;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue