vlib: multiarch vlib_frame_queue_dequeue()
[vpp.git] / src / vlib / main.c
index 62da7b9..c7c4aba 100644 (file)
@@ -614,7 +614,7 @@ vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n)
   if (n->type == VLIB_NODE_TYPE_PROCESS)
     {
       /* Nothing to do for PROCESS nodes except in main thread */
-      if (vm != &vlib_global_main)
+      if (vm != vlib_get_first_main ())
        return;
 
       vlib_process_t *p = vlib_get_process_from_node (vm, n);
@@ -747,10 +747,10 @@ elog_save_buffer (vlib_main_t * vm,
 void
 vlib_post_mortem_dump (void)
 {
-  vlib_main_t *vm = &vlib_global_main;
+  vlib_global_main_t *vgm = vlib_get_global_main ();
 
-  for (int i = 0; i < vec_len (vm->post_mortem_callbacks); i++)
-    (vm->post_mortem_callbacks[i]) ();
+  for (int i = 0; i < vec_len (vgm->post_mortem_callbacks); i++)
+    (vgm->post_mortem_callbacks[i]) ();
 }
 
 /* *INDENT-OFF* */
@@ -901,7 +901,7 @@ vlib_elog_main_loop_event (vlib_main_t * vm,
                           u32 node_index,
                           u64 time, u32 n_vectors, u32 is_return)
 {
-  vlib_main_t *evm = &vlib_global_main;
+  vlib_main_t *evm = vlib_get_first_main ();
   elog_main_t *em = vlib_get_elog_main ();
   int enabled = evm->elog_trace_graph_dispatch |
     evm->elog_trace_graph_circuit;
@@ -934,29 +934,14 @@ vlib_elog_main_loop_event (vlib_main_t * vm,
     }
 }
 
-#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
-void (*vlib_buffer_trace_trajectory_cb) (vlib_buffer_t * b, u32 node_index);
-void (*vlib_buffer_trace_trajectory_init_cb) (vlib_buffer_t * b);
-
-void
-vlib_buffer_trace_trajectory_init (vlib_buffer_t * b)
-{
-  if (PREDICT_TRUE (vlib_buffer_trace_trajectory_init_cb != 0))
-    {
-      (*vlib_buffer_trace_trajectory_init_cb) (b);
-    }
-}
-
-#endif
-
 static inline void
 add_trajectory_trace (vlib_buffer_t * b, u32 node_index)
 {
 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0
-  if (PREDICT_TRUE (vlib_buffer_trace_trajectory_cb != 0))
-    {
-      (*vlib_buffer_trace_trajectory_cb) (b, node_index);
-    }
+  if (PREDICT_FALSE (b->trajectory_nb >= VLIB_BUFFER_TRACE_TRAJECTORY_MAX))
+    return;
+  b->trajectory_trace[b->trajectory_nb] = node_index;
+  b->trajectory_nb++;
 #endif
 }
 
@@ -1091,7 +1076,8 @@ dispatch_node (vlib_main_t * vm,
          nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] -= 1;
          nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] += 1;
 
-         if (PREDICT_FALSE (vlib_global_main.elog_trace_graph_dispatch))
+         if (PREDICT_FALSE (
+               vlib_get_first_main ()->elog_trace_graph_dispatch))
            {
              vlib_worker_thread_t *w = vlib_worker_threads
                + vm->thread_index;
@@ -1126,7 +1112,8 @@ dispatch_node (vlib_main_t * vm,
                + vm->thread_index;
              node->flags |=
                VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE;
-             if (PREDICT_FALSE (vlib_global_main.elog_trace_graph_dispatch))
+             if (PREDICT_FALSE (
+                   vlib_get_first_main ()->elog_trace_graph_dispatch))
                {
                  ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
                                        w->elog_track);
@@ -1594,6 +1581,8 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
       if (PREDICT_FALSE (vm->check_frame_queues + frame_queue_check_counter))
        {
          u32 processed = 0;
+         vlib_frame_queue_dequeue_fn_t *fn =
+           vlib_buffer_func_main.frame_queue_dequeue_fn;
 
          if (vm->check_frame_queues)
            {
@@ -1602,7 +1591,7 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
            }
 
          vec_foreach (fqm, tm->frame_queue_mains)
-           processed += vlib_frame_queue_dequeue (vm, fqm);
+           processed += (fn) (vm, fqm);
 
          /* No handoff queue work found? */
          if (processed)
@@ -1794,26 +1783,26 @@ vlib_worker_loop (vlib_main_t * vm)
   vlib_main_or_worker_loop (vm, /* is_main */ 0);
 }
 
-vlib_main_t vlib_global_main;
+vlib_global_main_t vlib_global_main;
 
 void
 vlib_add_del_post_mortem_callback (void *cb, int is_add)
 {
-  vlib_main_t *vm = &vlib_global_main;
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   int i;
 
   if (is_add == 0)
     {
-      for (i = vec_len (vm->post_mortem_callbacks) - 1; i >= 0; i--)
-       if (vm->post_mortem_callbacks[i] == cb)
-         vec_del1 (vm->post_mortem_callbacks, i);
+      for (i = vec_len (vgm->post_mortem_callbacks) - 1; i >= 0; i--)
+       if (vgm->post_mortem_callbacks[i] == cb)
+         vec_del1 (vgm->post_mortem_callbacks, i);
       return;
     }
 
-  for (i = 0; i < vec_len (vm->post_mortem_callbacks); i++)
-    if (vm->post_mortem_callbacks[i] == cb)
+  for (i = 0; i < vec_len (vgm->post_mortem_callbacks); i++)
+    if (vgm->post_mortem_callbacks[i] == cb)
       return;
-  vec_add1 (vm->post_mortem_callbacks, cb);
+  vec_add1 (vgm->post_mortem_callbacks, cb);
 }
 
 static void
@@ -1836,6 +1825,7 @@ elog_post_mortem_dump (void)
 static clib_error_t *
 vlib_main_configure (vlib_main_t * vm, unformat_input_t * input)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   int turn_on_mem_trace = 0;
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
@@ -1844,9 +1834,9 @@ vlib_main_configure (vlib_main_t * vm, unformat_input_t * input)
        turn_on_mem_trace = 1;
 
       else if (unformat (input, "elog-events %d",
-                        &vm->configured_elog_ring_size))
-       vm->configured_elog_ring_size =
-         1 << max_log2 (vm->configured_elog_ring_size);
+                        &vgm->configured_elog_ring_size))
+       vgm->configured_elog_ring_size =
+         1 << max_log2 (vgm->configured_elog_ring_size);
       else if (unformat (input, "elog-post-mortem-dump"))
        vlib_add_del_post_mortem_callback (elog_post_mortem_dump,
                                           /* is_add */ 1);
@@ -1923,21 +1913,22 @@ vl_api_get_elog_trace_api_messages (void)
 int
 vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   clib_error_t *volatile error;
   vlib_node_main_t *nm = &vm->node_main;
 
   vm->queue_signal_callback = placeholder_queue_signal_callback;
 
   /* Reconfigure event log which is enabled very early */
-  if (vm->configured_elog_ring_size &&
-      vm->configured_elog_ring_size != vm->elog_main.event_ring_size)
-    elog_resize (&vm->elog_main, vm->configured_elog_ring_size);
+  if (vgm->configured_elog_ring_size &&
+      vgm->configured_elog_ring_size != vgm->elog_main.event_ring_size)
+    elog_resize (&vgm->elog_main, vgm->configured_elog_ring_size);
   vl_api_set_elog_main (vlib_get_elog_main ());
   (void) vl_api_set_elog_trace_api_messages (1);
 
   /* Default name. */
-  if (!vm->name)
-    vm->name = "VLIB";
+  if (!vgm->name)
+    vgm->name = "VLIB";
 
   if ((error = vlib_physmem_init (vm)))
     {
@@ -2005,8 +1996,8 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
     }
 
   /* See unix/main.c; most likely already set up */
-  if (vm->init_functions_called == 0)
-    vm->init_functions_called = hash_create (0, /* value bytes */ 0);
+  if (vgm->init_functions_called == 0)
+    vgm->init_functions_called = hash_create (0, /* value bytes */ 0);
   if ((error = vlib_call_all_init_functions (vm)))
     goto done;
 
@@ -2048,7 +2039,7 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
   vm->damping_constant = exp (-1.0 / 20.0);
 
   /* Sort per-thread init functions before we start threads */
-  vlib_sort_init_exit_functions (&vm->worker_init_function_registrations);
+  vlib_sort_init_exit_functions (&vgm->worker_init_function_registrations);
 
   /* Call all main loop enter functions. */
   {