net: fix 64 bit counters on 32 bit arches

There is a small possibility that a reader gets incorrect values on 32
bit arches. SNMP applications could catch incorrect counters when a
32bit high part is changed by another stats consumer/provider.

One way to solve this is to add a rtnl_link_stats64 param to all
ndo_get_stats64() methods, and also add such a parameter to
dev_get_stats().

Rule is that we are not allowed to use dev->stats64 as a temporary
storage for 64bit stats, but a caller provided area (usually on stack)

Old drivers (only providing get_stats() method) need no changes.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet
2010-07-07 14:58:56 -07:00
committato da David S. Miller
parent 217d32dc5f
commit 28172739f0
18 ha cambiato i file con 84 aggiunte e 66 eliminazioni

Vedi File

@@ -98,10 +98,10 @@ static int br_dev_stop(struct net_device *dev)
return 0;
}
static struct rtnl_link_stats64 *br_get_stats64(struct net_device *dev)
static struct rtnl_link_stats64 *br_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats)
{
struct net_bridge *br = netdev_priv(dev);
struct rtnl_link_stats64 *stats = &dev->stats64;
struct br_cpu_netstats tmp, sum = { 0 };
unsigned int cpu;