diff options
Diffstat (limited to 'include/net/snmp.h')
-rw-r--r-- | include/net/snmp.h | 75 |
1 files changed, 71 insertions, 4 deletions
diff --git a/include/net/snmp.h b/include/net/snmp.h index 899003d18db9..a0e61806d480 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h | |||
@@ -47,15 +47,16 @@ struct snmp_mib { | |||
47 | } | 47 | } |
48 | 48 | ||
49 | /* | 49 | /* |
50 | * We use all unsigned longs. Linux will soon be so reliable that even | 50 | * We use unsigned longs for most mibs but u64 for ipstats. |
51 | * these will rapidly get too small 8-). Seriously consider the IpInReceives | ||
52 | * count on the 20Gb/s + networks people expect in a few years time! | ||
53 | */ | 51 | */ |
52 | #include <linux/u64_stats_sync.h> | ||
54 | 53 | ||
55 | /* IPstats */ | 54 | /* IPstats */ |
56 | #define IPSTATS_MIB_MAX __IPSTATS_MIB_MAX | 55 | #define IPSTATS_MIB_MAX __IPSTATS_MIB_MAX |
57 | struct ipstats_mib { | 56 | struct ipstats_mib { |
58 | unsigned long mibs[IPSTATS_MIB_MAX]; | 57 | /* mibs[] must be first field of struct ipstats_mib */ |
58 | u64 mibs[IPSTATS_MIB_MAX]; | ||
59 | struct u64_stats_sync syncp; | ||
59 | }; | 60 | }; |
60 | 61 | ||
61 | /* ICMP */ | 62 | /* ICMP */ |
@@ -155,4 +156,70 @@ struct linux_xfrm_mib { | |||
155 | ptr->mibs[basefield##PKTS]++; \ | 156 | ptr->mibs[basefield##PKTS]++; \ |
156 | ptr->mibs[basefield##OCTETS] += addend;\ | 157 | ptr->mibs[basefield##OCTETS] += addend;\ |
157 | } while (0) | 158 | } while (0) |
159 | |||
160 | |||
161 | #if BITS_PER_LONG==32 | ||
162 | |||
163 | #define SNMP_ADD_STATS64_BH(mib, field, addend) \ | ||
164 | do { \ | ||
165 | __typeof__(*mib[0]) *ptr = __this_cpu_ptr((mib)[0]); \ | ||
166 | u64_stats_update_begin(&ptr->syncp); \ | ||
167 | ptr->mibs[field] += addend; \ | ||
168 | u64_stats_update_end(&ptr->syncp); \ | ||
169 | } while (0) | ||
170 | #define SNMP_ADD_STATS64_USER(mib, field, addend) \ | ||
171 | do { \ | ||
172 | __typeof__(*mib[0]) *ptr; \ | ||
173 | preempt_disable(); \ | ||
174 | ptr = __this_cpu_ptr((mib)[1]); \ | ||
175 | u64_stats_update_begin(&ptr->syncp); \ | ||
176 | ptr->mibs[field] += addend; \ | ||
177 | u64_stats_update_end(&ptr->syncp); \ | ||
178 | preempt_enable(); \ | ||
179 | } while (0) | ||
180 | #define SNMP_ADD_STATS64(mib, field, addend) \ | ||
181 | do { \ | ||
182 | __typeof__(*mib[0]) *ptr; \ | ||
183 | preempt_disable(); \ | ||
184 | ptr = __this_cpu_ptr((mib)[!in_softirq()]); \ | ||
185 | u64_stats_update_begin(&ptr->syncp); \ | ||
186 | ptr->mibs[field] += addend; \ | ||
187 | u64_stats_update_end(&ptr->syncp); \ | ||
188 | preempt_enable(); \ | ||
189 | } while (0) | ||
190 | #define SNMP_INC_STATS64_BH(mib, field) SNMP_ADD_STATS64_BH(mib, field, 1) | ||
191 | #define SNMP_INC_STATS64_USER(mib, field) SNMP_ADD_STATS64_USER(mib, field, 1) | ||
192 | #define SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1) | ||
193 | #define SNMP_UPD_PO_STATS64(mib, basefield, addend) \ | ||
194 | do { \ | ||
195 | __typeof__(*mib[0]) *ptr; \ | ||
196 | preempt_disable(); \ | ||
197 | ptr = __this_cpu_ptr((mib)[!in_softirq()]); \ | ||
198 | u64_stats_update_begin(&ptr->syncp); \ | ||
199 | ptr->mibs[basefield##PKTS]++; \ | ||
200 | ptr->mibs[basefield##OCTETS] += addend; \ | ||
201 | u64_stats_update_end(&ptr->syncp); \ | ||
202 | preempt_enable(); \ | ||
203 | } while (0) | ||
204 | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) \ | ||
205 | do { \ | ||
206 | __typeof__(*mib[0]) *ptr; \ | ||
207 | ptr = __this_cpu_ptr((mib)[!in_softirq()]); \ | ||
208 | u64_stats_update_begin(&ptr->syncp); \ | ||
209 | ptr->mibs[basefield##PKTS]++; \ | ||
210 | ptr->mibs[basefield##OCTETS] += addend; \ | ||
211 | u64_stats_update_end(&ptr->syncp); \ | ||
212 | } while (0) | ||
213 | #else | ||
214 | #define SNMP_INC_STATS64_BH(mib, field) SNMP_INC_STATS_BH(mib, field) | ||
215 | #define SNMP_INC_STATS64_USER(mib, field) SNMP_INC_STATS_USER(mib, field) | ||
216 | #define SNMP_INC_STATS64(mib, field) SNMP_INC_STATS(mib, field) | ||
217 | #define SNMP_DEC_STATS64(mib, field) SNMP_DEC_STATS(mib, field) | ||
218 | #define SNMP_ADD_STATS64_BH(mib, field, addend) SNMP_ADD_STATS_BH(mib, field, addend) | ||
219 | #define SNMP_ADD_STATS64_USER(mib, field, addend) SNMP_ADD_STATS_USER(mib, field, addend) | ||
220 | #define SNMP_ADD_STATS64(mib, field, addend) SNMP_ADD_STATS(mib, field, addend) | ||
221 | #define SNMP_UPD_PO_STATS64(mib, basefield, addend) SNMP_UPD_PO_STATS(mib, basefield, addend) | ||
222 | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) SNMP_UPD_PO_STATS_BH(mib, basefield, addend) | ||
223 | #endif | ||
224 | |||
158 | #endif | 225 | #endif |