diff options
-rw-r--r-- | src/plugins/dpdk/device/dpdk.h | 6 | ||||
-rw-r--r-- | src/plugins/dpdk/device/init.c | 56 |
2 files changed, 53 insertions, 9 deletions
diff --git a/src/plugins/dpdk/device/dpdk.h b/src/plugins/dpdk/device/dpdk.h index 28647913d1c..c22a67a07e7 100644 --- a/src/plugins/dpdk/device/dpdk.h +++ b/src/plugins/dpdk/device/dpdk.h @@ -222,11 +222,13 @@ typedef struct dpdk_port_conf_t conf; } dpdk_device_t; +#define DPDK_MIN_POLL_INTERVAL (0.001) /* 1msec */ + #define DPDK_STATS_POLL_INTERVAL (10.0) -#define DPDK_MIN_STATS_POLL_INTERVAL (0.001) /* 1msec */ +#define DPDK_MIN_STATS_POLL_INTERVAL DPDK_MIN_POLL_INTERVAL #define DPDK_LINK_POLL_INTERVAL (3.0) -#define DPDK_MIN_LINK_POLL_INTERVAL (0.001) /* 1msec */ +#define DPDK_MIN_LINK_POLL_INTERVAL DPDK_MIN_POLL_INTERVAL #define foreach_dpdk_device_config_item \ _ (num_rx_queues) \ 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; } |