diff options
author | 2024-02-28 17:04:44 +0100 | |
---|---|---|
committer | 2024-03-05 18:53:01 +0000 | |
commit | 904459ff32ffce73b97dd3cb40f0b367a6b558f9 (patch) | |
tree | 5151e6190448302f553b27fb01df654ac7926edc /src/plugins/dpdk/device/init.c | |
parent | 29e916a07c31d63ed6935354b99f16743842fdc6 (diff) |
dpdk: correct waiting times
When link state interval is 3 and stats interval is 10, updates
for stats will be made every 12 seconds (next number after 10,
that divisible by 3). And if you get counters every 30 secs, you
will get ideal "saw"-line instead of real smooth chart.
This commit makes smooth line on stats intervals that are divisors
of the charts update interval (regardless of link state interval),
and makes it possible to configure them.
Type: fix
Fixes: cb9cadad578297ffd78fa8a33670bdf1ab669e7e
Change-Id: Ia4350467be2b0ec0c1be37c7fda63f43b3330f44
Signed-off-by: Georgy Borodin <bor1-go@yandex-team.ru>
Diffstat (limited to 'src/plugins/dpdk/device/init.c')
-rw-r--r-- | src/plugins/dpdk/device/init.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c index 789add58380..2da0258ca06 100644 --- a/src/plugins/dpdk/device/init.c +++ b/src/plugins/dpdk/device/init.c @@ -1010,6 +1010,26 @@ dpdk_log_read_ready (clib_file_t * uf) } static clib_error_t * +dpdk_set_stat_poll_interval (f64 interval) +{ + if (interval < DPDK_MIN_STATS_POLL_INTERVAL) + return clib_error_return (0, "wrong stats-poll-interval value"); + + dpdk_main.stat_poll_interval = interval; + return 0; +} + +static clib_error_t * +dpdk_set_link_state_poll_interval (f64 interval) +{ + if (interval < DPDK_MIN_LINK_POLL_INTERVAL) + return clib_error_return (0, "wrong link-state-poll-interval value"); + + dpdk_main.link_state_poll_interval = interval; + return 0; +} + +static clib_error_t * dpdk_config (vlib_main_t * vm, unformat_input_t * input) { dpdk_main_t *dm = &dpdk_main; @@ -1033,6 +1053,7 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) u32 vendor, device, domain, bus, func; void *fmt_func; void *fmt_addr; + f64 poll_interval; huge_dir_path = format (0, "%s/hugepages%c", vlib_unix_get_runtime_dir (), 0); @@ -1071,6 +1092,18 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) else if (unformat (input, "max-simd-bitwidth %U", unformat_max_simd_bitwidth, &conf->max_simd_bitwidth)) ; + else if (unformat (input, "link-state-poll-interval %f", &poll_interval)) + { + error = dpdk_set_link_state_poll_interval (poll_interval); + if (error != 0) + return error; + } + else if (unformat (input, "stats-poll-interval %f", &poll_interval)) + { + error = dpdk_set_stat_poll_interval (poll_interval); + if (error != 0) + return error; + } else if (unformat (input, "dev default %U", unformat_vlib_cli_sub_input, &sub_input)) { @@ -1499,16 +1532,17 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) dpdk_update_link_state (xd, now); } + f64 timeout = + clib_min (dm->link_state_poll_interval, dm->stat_poll_interval); + while (1) { - /* - * check each time through the loop in case intervals are changed - */ - f64 min_wait = dm->link_state_poll_interval < dm->stat_poll_interval ? - dm->link_state_poll_interval : dm->stat_poll_interval; - + f64 min_wait = clib_max (timeout, DPDK_MIN_POLL_INTERVAL); vlib_process_wait_for_event_or_clock (vm, min_wait); + timeout = + clib_min (dm->link_state_poll_interval, dm->stat_poll_interval); + if (dm->admin_up_down_in_progress) /* skip the poll if an admin up down is in progress (on any interface) */ continue; @@ -1522,8 +1556,16 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) dpdk_update_link_state (xd, now); } - } + now = vlib_time_now (vm); + vec_foreach (xd, dm->devices) + { + timeout = clib_min (timeout, xd->time_last_stats_update + + dm->stat_poll_interval - now); + timeout = clib_min (timeout, xd->time_last_link_update + + dm->link_state_poll_interval - now); + } + } return 0; } |