Move rte_delay_us_override so it overrides DPDK 19/1219/2
authorTodd Foggoa <tfoggoa@cisco.com>
Sat, 21 May 2016 02:10:34 +0000 (22:10 -0400)
committerDamjan Marion <damarion@cisco.com>
Mon, 23 May 2016 21:16:45 +0000 (21:16 +0000)
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>
vnet/vnet/devices/dpdk/device.c
vnet/vnet/devices/dpdk/dpdk.h
vpp/vnet/main.c

index a38c8d1..c53d22b 100644 (file)
@@ -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)
@@ -1266,47 +1266,6 @@ void post_sw_interface_set_flags (vlib_main_t *vm, u32 sw_if_index, u32 flags)
   d[1] = 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.
  */
index 525cd8d..2006f6f 100644 (file)
@@ -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__ */
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