-#if DPDK == 0
- if ((error = vlib_call_init_function (vm, ixge_init)))
- return error;
- if ((error = vlib_call_init_function (vm, ixgev_init)))
- return error;
- if ((error = vlib_call_init_function (vm, ige_init)))
- return error;
- if ((error = vlib_call_init_function (vm, vice_init)))
- return error;
-#else
- if ((error = vlib_call_init_function (vm, dpdk_init)))
- return error;
- if ((error = vlib_call_init_function (vm, vhost_user_init)))
- return error;
- if ((error = vlib_call_init_function (vm, ipsec_init)))
- return error;
-#endif
- if ((error = vlib_call_init_function (vm, vlibmemory_init)))
- return error;
- if ((error = vlib_call_init_function (vm, l2tp_init)))
- return error;
- if ((error = vlib_call_init_function (vm, gre_init)))
- return error;
- if ((error = vlib_call_init_function (vm, gre_interface_init)))
- return error;
- if ((error = vlib_call_init_function (vm, mpls_init)))
- return error;
- if ((error = vlib_call_init_function (vm, mpls_interface_init)))
- return error;
- if ((error = vlib_call_init_function (vm, dhcp_proxy_init)))
- return error;
- if ((error = vlib_call_init_function (vm, dhcpv6_proxy_init)))
- return error;
- if ((error = vlib_call_init_function (vm, tapcli_init)))
- return error;
- if ((error = vlib_call_init_function (vm, tuntap_init)))
- return error;
- if ((error = vlib_call_init_function (vm, gdb_func_init)))
- return error;
- if ((error = unix_physmem_init
- (vm, 0 /* fail_if_physical_memory_not_present */)))
- return error;
- if ((error = vlib_call_init_function (vm, tuntap_init)))
- return error;
- if ((error = vlib_call_init_function (vm, sr_init)))
- return error;
- if ((error = vlib_call_init_function (vm, l2_classify_init)))
- return error;
- if ((error = vlib_call_init_function (vm, policer_init)))
- return error;
- if ((error = vlib_call_init_function (vm, vxlan_init)))
- return error;
- if ((error = vlib_call_init_function (vm, vcgn_init)))
- return error;
- if ((error = vlib_call_init_function (vm, li_init)))
- return error;
-
- return error;
+ /* 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
+}
+
+static void
+rte_delay_us_override_cb (unsigned us)
+{
+ if (rte_delay_us_override (us) == 0)
+ rte_delay_us_block (us);