This is to introduced the generic batch interfaces for snmp_get_cpu_field{,64}.
It exchanges the two for-loops for collecting the percpu statistics data.
This can aggregate the data by going through all the items of each cpu
sequentially.

Signed-off-by: Jia He <hejia...@gmail.com>
Suggested-by: Marcelo Ricardo Leitner <marcelo.leit...@gmail.com>

---
 include/net/ip.h | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/include/net/ip.h b/include/net/ip.h
index 9742b92..bc43c0f 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -219,6 +219,29 @@ static inline u64 snmp_fold_field64(void __percpu *mib, 
int offt, size_t syncp_o
 }
 #endif
 
+#define snmp_get_cpu_field64_batch(buff64, stats_list, mib_statistic, offset) \
+{ \
+       int i, c; \
+       for_each_possible_cpu(c) { \
+               for (i = 0; stats_list[i].name; i++) \
+                       buff64[i] += snmp_get_cpu_field64( \
+                                       mib_statistic, \
+                                       c, stats_list[i].entry, \
+                                       offset); \
+       } \
+}
+
+#define snmp_get_cpu_field_batch(buff, stats_list, mib_statistic) \
+{ \
+       int i, c; \
+       for_each_possible_cpu(c) { \
+               for (i = 0; stats_list[i].name; i++) \
+                       buff[i] += snmp_get_cpu_field( \
+                                               mib_statistic, \
+                                               c, stats_list[i].entry); \
+       } \
+}
+
 void inet_get_local_port_range(struct net *net, int *low, int *high);
 
 #ifdef CONFIG_SYSCTL
-- 
1.8.3.1

Reply via email to