summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vnet/vnet/devices/dpdk/device.c43
-rw-r--r--vnet/vnet/devices/dpdk/dpdk.h5
-rw-r--r--vpp/vnet/main.c41
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