Move rte_delay_us_override so it overrides DPDK
[vpp.git] / vpp / vnet / main.c
index 2540083..a1c5427 100644 (file)
 
 #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