Message ID | 1461850404.5535.103.camel@edumazet-glaptop3.roam.corp.google.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 28 Apr 2016 06:33:24 -0700 > From: Eric Dumazet <edumazet@google.com> > > 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> Applied.
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)