diff options
author | Eric Dumazet <edumazet@google.com> | 2016-04-28 06:33:24 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-28 11:49:45 -0400 |
commit | ba7863f4d3bfe1698e0a92934cbc9c3021f4448d (patch) | |
tree | 1c16be7df70cdc963ef59fd3e9c5ecfb553fda00 | |
parent | 8be2748a40cb84c2ac5085e7e6bccb5a5fcc6235 (diff) | |
download | linux-ba7863f4d3bfe1698e0a92934cbc9c3021f4448d.tar.gz linux-ba7863f4d3bfe1698e0a92934cbc9c3021f4448d.tar.bz2 linux-ba7863f4d3bfe1698e0a92934cbc9c3021f4448d.zip |
net: snmp: fix 64bit stats on 32bit arches
I accidentally replaced BH disabling by preemption disabling
in SNMP_ADD_STATS64() and SNMP_UPD_PO_STATS64() on 32bit builds.
For 64bit stats on 32bit arch, we really need to disable BH,
since the "struct u64_stats_sync syncp" might be manipulated
both from process and BH contexts.
Fixes: 6aef70a851ac ("net: snmp: kill various STATS_USER() helpers")
Reported-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Tested-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/snmp.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/net/snmp.h b/include/net/snmp.h index 6bdd255b2250..c9228ad7ee91 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h @@ -166,9 +166,9 @@ struct linux_xfrm_mib { #define SNMP_ADD_STATS64(mib, field, addend) \ do { \ - preempt_disable(); \ + local_bh_disable(); \ __SNMP_ADD_STATS64(mib, field, addend); \ - preempt_enable(); \ + local_bh_enable(); \ } while (0) #define __SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1) @@ -184,9 +184,9 @@ struct linux_xfrm_mib { } while (0) #define SNMP_UPD_PO_STATS64(mib, basefield, addend) \ do { \ - preempt_disable(); \ + local_bh_disable(); \ __SNMP_UPD_PO_STATS64(mib, basefield, addend); \ - preempt_enable(); \ + local_bh_enable(); \ } while (0) #else #define __SNMP_INC_STATS64(mib, field) __SNMP_INC_STATS(mib, field) |