Sorry David, the previous attachment had a missing / in one filename
[NET] reduce per cpu ram used for loopback device 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 [EMAIL PROTECTED]
--- linux/drivers/net/loopback.c2006-10-18 17:28:20.0 +0200
+++ linux-ed/drivers/net/loopback.c 2006-10-18 18:26:41.0 +0200
@@ -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 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 @@
#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 *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;
}