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:

committed by
David S. Miller

parent
217d32dc5f
commit
28172739f0
@@ -171,6 +171,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
|
||||
int i, count;
|
||||
rndis_query_cmplt_type *resp;
|
||||
struct net_device *net;
|
||||
struct rtnl_link_stats64 temp;
|
||||
const struct rtnl_link_stats64 *stats;
|
||||
|
||||
if (!r) return -ENOMEM;
|
||||
@@ -194,7 +195,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
|
||||
resp->InformationBufferOffset = cpu_to_le32 (16);
|
||||
|
||||
net = rndis_per_dev_params[configNr].dev;
|
||||
stats = dev_get_stats(net);
|
||||
stats = dev_get_stats(net, &temp);
|
||||
|
||||
switch (OID) {
|
||||
|
||||
|
Reference in New Issue
Block a user