forked from mirrors/linux
		
	geneve: Handle stats using NETDEV_PCPU_STAT_DSTATS.
Geneve uses the TSTATS infrastructure (dev_sw_netstats_*()) for RX packet counters. All other counters are handled using atomic increments with DEV_STATS_INC(). Let's convert packet stats handling to DSTATS, which has a per-cpu counter for packet drops too, to avoid the cost of atomic increments in these cases. Statistics that don't fit DSTATS are still updated atomically with DEV_STATS_INC(). Signed-off-by: Guillaume Nault <gnault@redhat.com> Link: https://patch.msgid.link/7af5c09f3c26f0f231fbe383822ca5d1ce0278fa.1733313925.git.gnault@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									be226352e8
								
							
						
					
					
						commit
						6fa6de3022
					
				
					 1 changed files with 6 additions and 6 deletions
				
			
		|  | @ -235,7 +235,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs, | |||
| 					 vni_to_tunnel_id(gnvh->vni), | ||||
| 					 gnvh->opt_len * 4); | ||||
| 		if (!tun_dst) { | ||||
| 			DEV_STATS_INC(geneve->dev, rx_dropped); | ||||
| 			dev_dstats_rx_dropped(geneve->dev); | ||||
| 			goto drop; | ||||
| 		} | ||||
| 		/* Update tunnel dst according to Geneve options. */ | ||||
|  | @ -322,7 +322,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs, | |||
| 	len = skb->len; | ||||
| 	err = gro_cells_receive(&geneve->gro_cells, skb); | ||||
| 	if (likely(err == NET_RX_SUCCESS)) | ||||
| 		dev_sw_netstats_rx_add(geneve->dev, len); | ||||
| 		dev_dstats_rx_add(geneve->dev, len); | ||||
| 
 | ||||
| 	return; | ||||
| drop: | ||||
|  | @ -387,14 +387,14 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
| 
 | ||||
| 	if (unlikely((!geneve->cfg.inner_proto_inherit && | ||||
| 		      inner_proto != htons(ETH_P_TEB)))) { | ||||
| 		DEV_STATS_INC(geneve->dev, rx_dropped); | ||||
| 		dev_dstats_rx_dropped(geneve->dev); | ||||
| 		goto drop; | ||||
| 	} | ||||
| 
 | ||||
| 	opts_len = geneveh->opt_len * 4; | ||||
| 	if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len, inner_proto, | ||||
| 				 !net_eq(geneve->net, dev_net(geneve->dev)))) { | ||||
| 		DEV_STATS_INC(geneve->dev, rx_dropped); | ||||
| 		dev_dstats_rx_dropped(geneve->dev); | ||||
| 		goto drop; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1023,7 +1023,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) { | ||||
| 			netdev_dbg(dev, "no tunnel metadata\n"); | ||||
| 			dev_kfree_skb(skb); | ||||
| 			DEV_STATS_INC(dev, tx_dropped); | ||||
| 			dev_dstats_tx_dropped(dev); | ||||
| 			return NETDEV_TX_OK; | ||||
| 		} | ||||
| 	} else { | ||||
|  | @ -1202,7 +1202,7 @@ static void geneve_setup(struct net_device *dev) | |||
| 	dev->hw_features |= NETIF_F_RXCSUM; | ||||
| 	dev->hw_features |= NETIF_F_GSO_SOFTWARE; | ||||
| 
 | ||||
| 	dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; | ||||
| 	dev->pcpu_stat_type = NETDEV_PCPU_STAT_DSTATS; | ||||
| 	/* MTU range: 68 - (something less than 65535) */ | ||||
| 	dev->min_mtu = ETH_MIN_MTU; | ||||
| 	/* The max_mtu calculation does not take account of GENEVE
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Guillaume Nault
						Guillaume Nault