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
committed by David S. Miller
parent 217d32dc5f
commit 28172739f0
18 changed files with 84 additions and 66 deletions

View File

@@ -431,12 +431,12 @@ static void macvlan_uninit(struct net_device *dev)
free_percpu(vlan->rx_stats);
}
static struct rtnl_link_stats64 *macvlan_dev_get_stats64(struct net_device *dev)
static struct rtnl_link_stats64 *macvlan_dev_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats)
{
struct rtnl_link_stats64 *stats = &dev->stats64;
struct macvlan_dev *vlan = netdev_priv(dev);
dev_txq_stats_fold(dev, &dev->stats);
dev_txq_stats_fold(dev, (struct net_device_stats *)stats);
if (vlan->rx_stats) {
struct macvlan_rx_stats *p, accum = {0};