diff options
author | Julian Anastasov <ja@ssi.bg> | 2015-02-06 02:44:44 -0500 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2015-02-09 02:59:03 -0500 |
commit | cd67cd5eb25ae9a7bafbfd3d52d4c05e1d80af3b (patch) | |
tree | 085939ed6ccffc6da505420513519d5d4c86dfc4 /include/net | |
parent | 4c1017aa80c95a74703139bb95c4ce0d130efe4d (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.h | 50 |
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 */ |
367 | struct ip_vs_counters { | 367 | struct 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 */ |
375 | struct ip_vs_cpu_stats { | 375 | struct 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 | */ | ||
400 | struct 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 | ||
397 | struct ip_vs_stats { | 414 | struct 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 | ||
405 | struct dst_entry; | 422 | struct dst_entry; |
@@ -1388,8 +1405,7 @@ void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp, int pkts); | |||
1388 | void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats); | 1405 | void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats); |
1389 | void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats); | 1406 | void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats); |
1390 | void ip_vs_zero_estimator(struct ip_vs_stats *stats); | 1407 | void ip_vs_zero_estimator(struct ip_vs_stats *stats); |
1391 | void ip_vs_read_estimator(struct ip_vs_stats_user *dst, | 1408 | void 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) */ |
1395 | int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | 1411 | int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, |