aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorJulian Anastasov <ja@ssi.bg>2015-02-06 02:44:44 -0500
committerSimon Horman <horms@verge.net.au>2015-02-09 02:59:03 -0500
commitcd67cd5eb25ae9a7bafbfd3d52d4c05e1d80af3b (patch)
tree085939ed6ccffc6da505420513519d5d4c86dfc4 /include/net
parent4c1017aa80c95a74703139bb95c4ce0d130efe4d (diff)
ipvs: use 64-bit rates in stats
IPVS stats are limited to 2^(32-10) conns/s and packets/s, 2^(32-5) bytes/s. It is time to use 64 bits: * Change all conn/packet kernel counters to 64-bit and update them in u64_stats_update_{begin,end} section * In kernel use struct ip_vs_kstats instead of the user-space struct ip_vs_stats_user and use new func ip_vs_export_stats_user to export it to sockopt users to preserve compatibility with 32-bit values * Rename cpu counters "ustats" to "cnt" * To netlink users provide additionally 64-bit stats: IPVS_SVC_ATTR_STATS64 and IPVS_DEST_ATTR_STATS64. Old stats remain for old binaries. * We can use ip_vs_copy_stats in ip_vs_stats_percpu_show Thanks to Chris Caputo for providing initial patch for ip_vs_est.c Signed-off-by: Chris Caputo <ccaputo@alt.net> Signed-off-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/ip_vs.h50
1 files changed, 33 insertions, 17 deletions
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 615b20b58545..a627fe690c19 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -365,15 +365,15 @@ struct ip_vs_seq {
365 365
366/* counters per cpu */ 366/* counters per cpu */
367struct ip_vs_counters { 367struct ip_vs_counters {
368 __u32 conns; /* connections scheduled */ 368 __u64 conns; /* connections scheduled */
369 __u32 inpkts; /* incoming packets */ 369 __u64 inpkts; /* incoming packets */
370 __u32 outpkts; /* outgoing packets */ 370 __u64 outpkts; /* outgoing packets */
371 __u64 inbytes; /* incoming bytes */ 371 __u64 inbytes; /* incoming bytes */
372 __u64 outbytes; /* outgoing bytes */ 372 __u64 outbytes; /* outgoing bytes */
373}; 373};
374/* Stats per cpu */ 374/* Stats per cpu */
375struct ip_vs_cpu_stats { 375struct ip_vs_cpu_stats {
376 struct ip_vs_counters ustats; 376 struct ip_vs_counters cnt;
377 struct u64_stats_sync syncp; 377 struct u64_stats_sync syncp;
378}; 378};
379 379
@@ -383,23 +383,40 @@ struct ip_vs_estimator {
383 383
384 u64 last_inbytes; 384 u64 last_inbytes;
385 u64 last_outbytes; 385 u64 last_outbytes;
386 u32 last_conns; 386 u64 last_conns;
387 u32 last_inpkts; 387 u64 last_inpkts;
388 u32 last_outpkts; 388 u64 last_outpkts;
389 389
390 u32 cps; 390 u64 cps;
391 u32 inpps; 391 u64 inpps;
392 u32 outpps; 392 u64 outpps;
393 u32 inbps; 393 u64 inbps;
394 u32 outbps; 394 u64 outbps;
395};
396
397/*
398 * IPVS statistics object, 64-bit kernel version of struct ip_vs_stats_user
399 */
400struct ip_vs_kstats {
401 u64 conns; /* connections scheduled */
402 u64 inpkts; /* incoming packets */
403 u64 outpkts; /* outgoing packets */
404 u64 inbytes; /* incoming bytes */
405 u64 outbytes; /* outgoing bytes */
406
407 u64 cps; /* current connection rate */
408 u64 inpps; /* current in packet rate */
409 u64 outpps; /* current out packet rate */
410 u64 inbps; /* current in byte rate */
411 u64 outbps; /* current out byte rate */
395}; 412};
396 413
397struct ip_vs_stats { 414struct ip_vs_stats {
398 struct ip_vs_stats_user ustats; /* statistics */ 415 struct ip_vs_kstats kstats; /* kernel statistics */
399 struct ip_vs_estimator est; /* estimator */ 416 struct ip_vs_estimator est; /* estimator */
400 struct ip_vs_cpu_stats __percpu *cpustats; /* per cpu counters */ 417 struct ip_vs_cpu_stats __percpu *cpustats; /* per cpu counters */
401 spinlock_t lock; /* spin lock */ 418 spinlock_t lock; /* spin lock */
402 struct ip_vs_stats_user ustats0; /* reset values */ 419 struct ip_vs_kstats kstats0; /* reset values */
403}; 420};
404 421
405struct dst_entry; 422struct dst_entry;
@@ -1388,8 +1405,7 @@ void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp, int pkts);
1388void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats); 1405void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats);
1389void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats); 1406void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats);
1390void ip_vs_zero_estimator(struct ip_vs_stats *stats); 1407void ip_vs_zero_estimator(struct ip_vs_stats *stats);
1391void ip_vs_read_estimator(struct ip_vs_stats_user *dst, 1408void ip_vs_read_estimator(struct ip_vs_kstats *dst, struct ip_vs_stats *stats);
1392 struct ip_vs_stats *stats);
1393 1409
1394/* Various IPVS packet transmitters (from ip_vs_xmit.c) */ 1410/* Various IPVS packet transmitters (from ip_vs_xmit.c) */
1395int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, 1411int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,