IPv6 ND Router discovery data plane (VPP-1095)
[vpp.git] / src / vlib / main.c
index d32ca7b..d1f7592 100644 (file)
@@ -460,7 +460,7 @@ vlib_put_next_frame (vlib_main_t * vm,
   vlib_frame_t *f;
   u32 n_vectors_in_frame;
 
-  if (vm->buffer_main->callbacks_registered == 0 && CLIB_DEBUG > 0)
+  if (buffer_main.callbacks_registered == 0 && CLIB_DEBUG > 0)
     vlib_put_next_frame_validate (vm, r, next_index, n_vectors_left);
 
   nf = vlib_node_runtime_get_next_frame (vm, r, next_index);
@@ -1493,13 +1493,12 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
        }
 
       /* Process pre-input nodes. */
-      if (is_main)
-       vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT])
-         cpu_time_now = dispatch_node (vm, n,
-                                       VLIB_NODE_TYPE_PRE_INPUT,
-                                       VLIB_NODE_STATE_POLLING,
-                                       /* frame */ 0,
-                                       cpu_time_now);
+      vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT])
+       cpu_time_now = dispatch_node (vm, n,
+                                     VLIB_NODE_TYPE_PRE_INPUT,
+                                     VLIB_NODE_STATE_POLLING,
+                                     /* frame */ 0,
+                                     cpu_time_now);
 
       /* Next process input nodes. */
       vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_INPUT])
@@ -1514,13 +1513,19 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main)
 
       /* Next handle interrupts. */
       {
+       /* unlocked read, for performance */
        uword l = _vec_len (nm->pending_interrupt_node_runtime_indices);
        uword i;
-       if (l > 0)
+       if (PREDICT_FALSE (l > 0))
          {
            u32 *tmp;
            if (!is_main)
-             clib_spinlock_lock (&nm->pending_interrupt_lock);
+             {
+               clib_spinlock_lock (&nm->pending_interrupt_lock);
+               /* Re-read w/ lock held, in case another thread added an item */
+               l = _vec_len (nm->pending_interrupt_node_runtime_indices);
+             }
+
            tmp = nm->pending_interrupt_node_runtime_indices;
            nm->pending_interrupt_node_runtime_indices =
              last_node_runtime_indices;
@@ -1736,9 +1741,8 @@ vlib_main (vlib_main_t * volatile vm, unformat_input_t * input)
     goto done;
 
   /* Create default buffer free list. */
-  vlib_buffer_get_or_create_free_list (vm,
-                                      VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES,
-                                      "default");
+  vlib_buffer_create_free_list (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES,
+                               "default");
 
   nm->timing_wheel = clib_mem_alloc_aligned (sizeof (TWT (tw_timer_wheel)),
                                             CLIB_CACHE_LINE_BYTES);