diff options
-rw-r--r-- | vnet/vnet/devices/dpdk/device.c | 43 | ||||
-rw-r--r-- | vnet/vnet/devices/dpdk/dpdk.h | 5 | ||||
-rw-r--r-- | vpp/vnet/main.c | 41 |
3 files changed, 47 insertions, 42 deletions
diff --git a/vnet/vnet/devices/dpdk/device.c b/vnet/vnet/devices/dpdk/device.c index a38c8d1915f..c53d22bf957 100644 --- a/vnet/vnet/devices/dpdk/device.c +++ b/vnet/vnet/devices/dpdk/device.c @@ -1201,7 +1201,7 @@ u32 dpdk_get_admin_up_down_in_progress (void) return dpdk_main.admin_up_down_in_progress; } -static uword +uword admin_up_down_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) @@ -1267,47 +1267,6 @@ void post_sw_interface_set_flags (vlib_main_t *vm, u32 sw_if_index, u32 flags) } /* - * Called by the dpdk driver's rte_delay_us() function. - * Return 0 to have the dpdk do a regular delay loop. - * Return 1 if to skip the delay loop because we are suspending - * the calling vlib process instead. - */ -int rte_delay_us_override (unsigned us) { - vlib_main_t * vm; - - /* Don't bother intercepting for short delays */ - if (us < 10) return 0; - - /* - * Only intercept if we are in a vlib process. - * If we are called from a vlib worker thread or the vlib main - * thread then do not intercept. (Must not be called from an - * independent pthread). - */ - if (os_get_cpu_number() == 0) - { - /* - * We're in the vlib main thread or a vlib process. Make sure - * the process is running and we're not still initializing. - */ - vm = vlib_get_main(); - if (vlib_in_process_context(vm)) - { - /* Only suspend for the admin_down_process */ - vlib_process_t * proc = vlib_get_current_process(vm); - if (!(proc->flags & VLIB_PROCESS_IS_RUNNING) || - (proc->node_runtime.function != admin_up_down_process)) - return 0; - - f64 delay = 1e-6 * us; - vlib_process_suspend(vm, delay); - return 1; - } - } - return 0; // no override -} - -/* * Return a copy of the DPDK port stats in dest. */ clib_error_t* diff --git a/vnet/vnet/devices/dpdk/dpdk.h b/vnet/vnet/devices/dpdk/dpdk.h index 525cd8d1d6b..2006f6fe149 100644 --- a/vnet/vnet/devices/dpdk/dpdk.h +++ b/vnet/vnet/devices/dpdk/dpdk.h @@ -682,4 +682,9 @@ dpdk_pmd_constructor_init() } +uword +admin_up_down_process (vlib_main_t * vm, + vlib_node_runtime_t * rt, + vlib_frame_t * f); + #endif /* __included_dpdk_h__ */ diff --git a/vpp/vnet/main.c b/vpp/vnet/main.c index 2540083982b..a1c5427f06e 100644 --- a/vpp/vnet/main.c +++ b/vpp/vnet/main.c @@ -23,6 +23,47 @@ #if DPDK #include <vnet/devices/dpdk/dpdk.h> + +/* + * Called by the dpdk driver's rte_delay_us() function. + * Return 0 to have the dpdk do a regular delay loop. + * Return 1 if to skip the delay loop because we are suspending + * the calling vlib process instead. + */ +int rte_delay_us_override (unsigned us) { + vlib_main_t * vm; + + /* Don't bother intercepting for short delays */ + if (us < 10) return 0; + + /* + * Only intercept if we are in a vlib process. + * If we are called from a vlib worker thread or the vlib main + * thread then do not intercept. (Must not be called from an + * independent pthread). + */ + if (os_get_cpu_number() == 0) + { + /* + * We're in the vlib main thread or a vlib process. Make sure + * the process is running and we're not still initializing. + */ + vm = vlib_get_main(); + if (vlib_in_process_context(vm)) + { + /* Only suspend for the admin_down_process */ + vlib_process_t * proc = vlib_get_current_process(vm); + if (!(proc->flags & VLIB_PROCESS_IS_RUNNING) || + (proc->node_runtime.function != admin_up_down_process)) + return 0; + + f64 delay = 1e-6 * us; + vlib_process_suspend(vm, delay); + return 1; + } + } + return 0; // no override +} #endif static void |