mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	[NET]: reduce per cpu ram used for loopback stats
We dont need a full struct net_device_stats (currently 23 long : 184 bytes on x86_64) per possible CPU, but only two counters : bytes and packets We save few CPU cycles too in loopback_xmit() not updating 4 fields, but 2. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									9ce8ade015
								
							
						
					
					
						commit
						5175c3786c
					
				
					 1 changed files with 19 additions and 16 deletions
				
			
		|  | @ -58,7 +58,11 @@ | |||
| #include <linux/tcp.h> | ||||
| #include <linux/percpu.h> | ||||
| 
 | ||||
| static DEFINE_PER_CPU(struct net_device_stats, loopback_stats); | ||||
| struct pcpu_lstats { | ||||
| 	unsigned long packets; | ||||
| 	unsigned long bytes; | ||||
| }; | ||||
| static DEFINE_PER_CPU(struct pcpu_lstats, pcpu_lstats); | ||||
| 
 | ||||
| #define LOOPBACK_OVERHEAD (128 + MAX_HEADER + 16 + 16) | ||||
| 
 | ||||
|  | @ -128,7 +132,7 @@ static void emulate_large_send_offload(struct sk_buff *skb) | |||
|  */ | ||||
| static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) | ||||
| { | ||||
| 	struct net_device_stats *lb_stats; | ||||
| 	struct pcpu_lstats *lb_stats; | ||||
| 
 | ||||
| 	skb_orphan(skb); | ||||
| 
 | ||||
|  | @ -149,11 +153,9 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| #endif | ||||
| 	dev->last_rx = jiffies; | ||||
| 
 | ||||
| 	lb_stats = &per_cpu(loopback_stats, get_cpu()); | ||||
| 	lb_stats->rx_bytes += skb->len; | ||||
| 	lb_stats->tx_bytes = lb_stats->rx_bytes; | ||||
| 	lb_stats->rx_packets++; | ||||
| 	lb_stats->tx_packets = lb_stats->rx_packets; | ||||
| 	lb_stats = &per_cpu(pcpu_lstats, get_cpu()); | ||||
| 	lb_stats->bytes += skb->len; | ||||
| 	lb_stats->packets++; | ||||
| 	put_cpu(); | ||||
| 
 | ||||
| 	netif_rx(skb); | ||||
|  | @ -166,20 +168,21 @@ static struct net_device_stats loopback_stats; | |||
| static struct net_device_stats *get_stats(struct net_device *dev) | ||||
| { | ||||
| 	struct net_device_stats *stats = &loopback_stats; | ||||
| 	unsigned long bytes = 0; | ||||
| 	unsigned long packets = 0; | ||||
| 	int i; | ||||
| 
 | ||||
| 	memset(stats, 0, sizeof(struct net_device_stats)); | ||||
| 
 | ||||
| 	for_each_possible_cpu(i) { | ||||
| 		struct net_device_stats *lb_stats; | ||||
| 		const struct pcpu_lstats *lb_stats; | ||||
| 
 | ||||
| 		lb_stats = &per_cpu(loopback_stats, i); | ||||
| 		stats->rx_bytes   += lb_stats->rx_bytes; | ||||
| 		stats->tx_bytes   += lb_stats->tx_bytes; | ||||
| 		stats->rx_packets += lb_stats->rx_packets; | ||||
| 		stats->tx_packets += lb_stats->tx_packets; | ||||
| 		lb_stats = &per_cpu(pcpu_lstats, i); | ||||
| 		bytes   += lb_stats->bytes; | ||||
| 		packets += lb_stats->packets; | ||||
| 	} | ||||
| 
 | ||||
| 	stats->rx_packets = packets; | ||||
| 	stats->tx_packets = packets; | ||||
| 	stats->rx_bytes = bytes; | ||||
| 	stats->tx_bytes = bytes; | ||||
| 	return stats; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet