vppinfra: momve clib_sysfs_list_to_bitmap to sysfs.c
[vpp.git] / src / vlib / threads.c
index 939f910..f3a6643 100644 (file)
@@ -166,33 +166,6 @@ sort_registrations_by_no_clone (void *a0, void *a1)
          - ((i32) ((*tr1)->no_data_structure_clone)));
 }
 
-static uword *
-clib_sysfs_list_to_bitmap (char *filename)
-{
-  FILE *fp;
-  uword *r = 0;
-
-  fp = fopen (filename, "r");
-
-  if (fp != NULL)
-    {
-      u8 *buffer = 0;
-      vec_validate (buffer, 256 - 1);
-      if (fgets ((char *) buffer, 256, fp))
-       {
-         unformat_input_t in;
-         unformat_init_string (&in, (char *) buffer,
-                               strlen ((char *) buffer));
-         if (unformat (&in, "%U", unformat_bitmap_list, &r) != 1)
-           clib_warning ("unformat_bitmap_list failed");
-         unformat_free (&in);
-       }
-      vec_free (buffer);
-      fclose (fp);
-    }
-  return r;
-}
-
 
 /* Called early in the init sequence */
 
@@ -670,6 +643,7 @@ vlib_launch_thread_int (void *fp, vlib_worker_thread_t * w, unsigned cpu_id)
 static clib_error_t *
 start_workers (vlib_main_t * vm)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   int i, j;
   vlib_worker_thread_t *w;
   vlib_main_t *vm_clone;
@@ -686,7 +660,7 @@ start_workers (vlib_main_t * vm)
   /* Set up the main thread */
   vec_add2_aligned (vlib_worker_threads, w, 1, CLIB_CACHE_LINE_BYTES);
   w->elog_track.name = "main thread";
-  elog_track_register (&vm->elog_main, &w->elog_track);
+  elog_track_register (vlib_get_elog_main (), &w->elog_track);
 
   if (vec_len (tm->thread_prefix))
     {
@@ -694,19 +668,17 @@ start_workers (vlib_main_t * vm)
       vlib_set_thread_name ((char *) w->name);
     }
 
-  vm->elog_main.lock =
+  vgm->elog_main.lock =
     clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, CLIB_CACHE_LINE_BYTES);
-  vm->elog_main.lock[0] = 0;
+  vgm->elog_main.lock[0] = 0;
 
   clib_callback_data_init (&vm->vlib_node_runtime_perf_callbacks,
                           &vm->worker_thread_main_loop_callback_lock);
 
-  /* Replace hand-crafted length-1 vector with a real vector */
-  vlib_mains = 0;
-
-  vec_validate_aligned (vlib_mains, n_vlib_mains - 1, CLIB_CACHE_LINE_BYTES);
-  _vec_len (vlib_mains) = 0;
-  vec_add1_aligned (vlib_mains, vm, CLIB_CACHE_LINE_BYTES);
+  vec_validate_aligned (vgm->vlib_mains, n_vlib_mains - 1,
+                       CLIB_CACHE_LINE_BYTES);
+  _vec_len (vgm->vlib_mains) = 0;
+  vec_add1_aligned (vgm->vlib_mains, vm, CLIB_CACHE_LINE_BYTES);
 
   if (n_vlib_mains > 1)
     {
@@ -727,7 +699,7 @@ start_workers (vlib_main_t * vm)
 
       /* Without update or refork */
       *vlib_worker_threads->node_reforks_required = 0;
-      vm->need_vlib_worker_thread_node_runtime_update = 0;
+      vgm->need_vlib_worker_thread_node_runtime_update = 0;
 
       /* init timing */
       vm->barrier_epoch = 0;
@@ -770,7 +742,7 @@ start_workers (vlib_main_t * vm)
              w->elog_track.name =
                (char *) format (0, "%s %d", tr->name, k + 1);
              vec_add1 (w->elog_track.name, 0);
-             elog_track_register (&vm->elog_main, &w->elog_track);
+             elog_track_register (vlib_get_elog_main (), &w->elog_track);
 
              if (tr->no_data_structure_clone)
                continue;
@@ -780,14 +752,13 @@ start_workers (vlib_main_t * vm)
 
              vm_clone = clib_mem_alloc_aligned (sizeof (*vm_clone),
                                                 CLIB_CACHE_LINE_BYTES);
-             clib_memcpy (vm_clone, vlib_mains[0], sizeof (*vm_clone));
+             clib_memcpy (vm_clone, vlib_get_first_main (),
+                          sizeof (*vm_clone));
 
              vm_clone->thread_index = worker_thread_index;
              vm_clone->heap_base = w->thread_mheap;
              vm_clone->heap_aligned_base = (void *)
                (((uword) w->thread_mheap) & ~(VLIB_FRAME_ALIGN - 1));
-             vm_clone->init_functions_called =
-               hash_create (0, /* value bytes */ 0);
              vm_clone->pending_rpc_requests = 0;
              vec_validate (vm_clone->pending_rpc_requests, 0);
              _vec_len (vm_clone->pending_rpc_requests) = 0;
@@ -799,7 +770,7 @@ start_workers (vlib_main_t * vm)
                (&vm_clone->vlib_node_runtime_perf_callbacks,
                 &vm_clone->worker_thread_main_loop_callback_lock);
 
-             nm = &vlib_mains[0]->node_main;
+             nm = &vlib_get_first_main ()->node_main;
              nm_clone = &vm_clone->node_main;
              /* fork next frames array, preserving node runtime indices */
              nm_clone->next_frames = vec_dup_aligned (nm->next_frames,
@@ -899,18 +870,20 @@ start_workers (vlib_main_t * vm)
              /* Packet trace buffers are guaranteed to be empty, nothing to do here */
 
              clib_mem_set_heap (oldheap);
-             vec_add1_aligned (vlib_mains, vm_clone, CLIB_CACHE_LINE_BYTES);
+             vec_add1_aligned (vgm->vlib_mains, vm_clone,
+                               CLIB_CACHE_LINE_BYTES);
 
              /* Switch to the stats segment ... */
              void *oldheap = vlib_stats_push_heap (0);
-             vm_clone->error_main.counters = vec_dup_aligned
-               (vlib_mains[0]->error_main.counters, CLIB_CACHE_LINE_BYTES);
+             vm_clone->error_main.counters =
+               vec_dup_aligned (vlib_get_first_main ()->error_main.counters,
+                                CLIB_CACHE_LINE_BYTES);
              vlib_stats_pop_heap2 (vm_clone->error_main.counters,
                                    worker_thread_index, oldheap, 1);
 
-             vm_clone->error_main.counters_last_clear = vec_dup_aligned
-               (vlib_mains[0]->error_main.counters_last_clear,
-                CLIB_CACHE_LINE_BYTES);
+             vm_clone->error_main.counters_last_clear = vec_dup_aligned (
+               vlib_get_first_main ()->error_main.counters_last_clear,
+               CLIB_CACHE_LINE_BYTES);
 
              worker_thread_index++;
            }
@@ -944,7 +917,7 @@ start_workers (vlib_main_t * vm)
                (char *) format (0, "%s %d", tr->name, j + 1);
              w->registration = tr;
              vec_add1 (w->elog_track.name, 0);
-             elog_track_register (&vm->elog_main, &w->elog_track);
+             elog_track_register (vlib_get_elog_main (), &w->elog_track);
            }
        }
     }
@@ -1386,9 +1359,10 @@ vnet_main_fixup (vlib_fork_fixup_t which)
 void
 vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   vlib_main_t *vm = vlib_get_main ();
 
-  if (vlib_mains == 0)
+  if (vgm->vlib_mains == 0)
     return;
 
   ASSERT (vlib_get_thread_index () == 0);
@@ -1557,6 +1531,7 @@ vlib_worker_thread_barrier_sync_int (vlib_main_t * vm, const char *func_name)
 void
 vlib_worker_thread_barrier_release (vlib_main_t * vm)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   f64 deadline;
   f64 now;
   f64 minimum_open;
@@ -1581,7 +1556,7 @@ vlib_worker_thread_barrier_release (vlib_main_t * vm)
     }
 
   /* Update (all) node runtimes before releasing the barrier, if needed */
-  if (vm->need_vlib_worker_thread_node_runtime_update)
+  if (vgm->need_vlib_worker_thread_node_runtime_update)
     {
       /*
        * Lock stat segment here, so we's safe when
@@ -1592,7 +1567,7 @@ vlib_worker_thread_barrier_release (vlib_main_t * vm)
 
       /* Do stats elements on main thread */
       worker_thread_node_runtime_update_internal ();
-      vm->need_vlib_worker_thread_node_runtime_update = 0;
+      vgm->need_vlib_worker_thread_node_runtime_update = 0;
 
       /* Do per thread rebuilds in parallel */
       refork_needed = 1;
@@ -1669,6 +1644,7 @@ vlib_worker_thread_barrier_release (vlib_main_t * vm)
 void
 vlib_worker_wait_one_loop (void)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   ASSERT (vlib_get_thread_index () == 0);
 
   if (vlib_get_n_threads () < 2)
@@ -1683,14 +1659,14 @@ vlib_worker_wait_one_loop (void)
   vec_validate (counts, vlib_get_n_threads () - 1);
 
   /* record the current loop counts */
-  vec_foreach_index (ii, vlib_mains)
-    counts[ii] = vlib_mains[ii]->main_loop_count;
+  vec_foreach_index (ii, vgm->vlib_mains)
+    counts[ii] = vgm->vlib_mains[ii]->main_loop_count;
 
   /* spin until each changes, apart from the main thread, or we'd be
    * a while */
   for (ii = 1; ii < vec_len (counts); ii++)
     {
-      while (counts[ii] == vlib_mains[ii]->main_loop_count)
+      while (counts[ii] == vgm->vlib_mains[ii]->main_loop_count)
        CLIB_PAUSE ();
     }
 
@@ -1717,7 +1693,7 @@ vlib_frame_queue_dequeue (vlib_main_t * vm, vlib_frame_queue_main_t * fqm)
   u32 vectors = 0;
 
   ASSERT (fq);
-  ASSERT (vm == vlib_mains[thread_id]);
+  ASSERT (vm == vlib_global_main.vlib_mains[thread_id]);
 
   if (PREDICT_FALSE (fqm->node_index == ~0))
     return 0;
@@ -1840,6 +1816,7 @@ vlib_frame_queue_dequeue (vlib_main_t * vm, vlib_frame_queue_main_t * fqm)
 void
 vlib_worker_thread_fn (void *arg)
 {
+  vlib_global_main_t *vgm = vlib_get_global_main ();
   vlib_worker_thread_t *w = (vlib_worker_thread_t *) arg;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   vlib_main_t *vm = vlib_get_main ();
@@ -1853,8 +1830,11 @@ vlib_worker_thread_fn (void *arg)
   clib_time_init (&vm->clib_time);
   clib_mem_set_heap (w->thread_mheap);
 
-  e = vlib_call_init_exit_functions_no_sort
-    (vm, &vm->worker_init_function_registrations, 1 /* call_once */ );
+  vm->worker_init_functions_called = hash_create (0, 0);
+
+  e = vlib_call_init_exit_functions_no_sort (
+    vm, &vgm->worker_init_function_registrations, 1 /* call_once */,
+    0 /* is_global */);
   if (e)
     clib_error_report (e);