summaryrefslogtreecommitdiffstats
path: root/vpp/vnet
diff options
context:
space:
mode:
authorTodd Foggoa <tfoggoa@cisco.com>2016-05-20 22:10:34 -0400
committerDamjan Marion <damarion@cisco.com>2016-05-23 21:16:45 +0000
commite3eefff5b34a2d18c0827d277d7911319a6282e7 (patch)
tree99a66b6bd00be595b25911c7fe1274477af74360 /vpp/vnet
parente36af5f3153e27d97021e5ac170c4513c195ed92 (diff)
Move rte_delay_us_override so it overrides DPDK
The current location in the vnet dynamic library does not override the dpdk weak function as intented. Moving this function to the main app allows the linker to find the non-weak symbol and override it. Change-Id: I96c6dc5af2e511cc1f84bd66419c5a4ac96a9541 Signed-off-by: Todd Foggoa <tfoggoa@cisco.com>
Diffstat (limited to 'vpp/vnet')
-rw-r--r--vpp/vnet/main.c41
1 files changed, 41 insertions, 0 deletions
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