vlib: remove unused code
[vpp.git] / src / vlib / threads.h
index 5a295e0..1da9d22 100644 (file)
 #define included_vlib_threads_h
 
 #include <vlib/main.h>
+#include <vppinfra/callback.h>
 #include <linux/sched.h>
 
-extern vlib_main_t **vlib_mains;
-
 void vlib_set_thread_name (char *name);
 
 /* arg is actually a vlib__thread_t * */
@@ -110,7 +109,7 @@ typedef struct
   long lwp;
   int cpu_id;
   int core_id;
-  int socket_id;
+  int numa_id;
   pthread_t thread_id;
 } vlib_worker_thread_t;
 
@@ -206,7 +205,13 @@ u32 vlib_frame_queue_main_init (u32 node_index, u32 frame_queue_nelts);
 void vlib_worker_thread_barrier_sync_int (vlib_main_t * vm,
                                          const char *func_name);
 void vlib_worker_thread_barrier_release (vlib_main_t * vm);
+u8 vlib_worker_thread_barrier_held (void);
+void vlib_worker_thread_initial_barrier_sync_and_release (vlib_main_t * vm);
 void vlib_worker_thread_node_refork (void);
+/**
+ * Wait until each of the workers has been once around the track
+ */
+void vlib_worker_wait_one_loop (void);
 
 static_always_inline uword
 vlib_get_thread_index (void)
@@ -224,36 +229,24 @@ vlib_smp_unsafe_warning (void)
     }
 }
 
-typedef enum
+always_inline int
+__foreach_vlib_main_helper (vlib_main_t *ii, vlib_main_t **p)
 {
-  VLIB_WORKER_THREAD_FORK_FIXUP_ILLEGAL = 0,
-  VLIB_WORKER_THREAD_FORK_FIXUP_NEW_SW_IF_INDEX,
-} vlib_fork_fixup_t;
-
-void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which);
-
-#define foreach_vlib_main(body)                         \
-do {                                                    \
-  vlib_main_t ** __vlib_mains = 0, *this_vlib_main;     \
-  int ii;                                               \
-                                                        \
-  for (ii = 0; ii < vec_len (vlib_mains); ii++)         \
-    {                                                   \
-      this_vlib_main = vlib_mains[ii];                  \
-      ASSERT (ii == 0 ||                                \
-             this_vlib_main->parked_at_barrier == 1);  \
-      if (this_vlib_main)                               \
-        vec_add1 (__vlib_mains, this_vlib_main);        \
-    }                                                   \
-                                                        \
-  for (ii = 0; ii < vec_len (__vlib_mains); ii++)       \
-    {                                                   \
-      this_vlib_main = __vlib_mains[ii];                \
-      /* body uses this_vlib_main... */                 \
-      (body);                                           \
-    }                                                   \
-  vec_free (__vlib_mains);                              \
-} while (0);
+  vlib_main_t *vm;
+  u32 index = ii - (vlib_main_t *) 0;
+
+  if (index >= vec_len (vlib_global_main.vlib_mains))
+    return 0;
+
+  *p = vm = vlib_global_main.vlib_mains[index];
+  ASSERT (index == 0 || vm->parked_at_barrier == 1);
+  return 1;
+}
+
+#define foreach_vlib_main()                                                   \
+  for (vlib_main_t *ii = 0, *this_vlib_main;                                  \
+       __foreach_vlib_main_helper (ii, &this_vlib_main); ii++)                \
+    if (this_vlib_main)
 
 #define foreach_sched_policy \
   _(SCHED_OTHER, OTHER, "other") \
@@ -337,6 +330,10 @@ typedef struct
   /* callbacks */
   vlib_thread_callbacks_t cb;
   int extern_thread_mgmt;
+
+  /* NUMA-bound heap size */
+  uword numa_heap_size;
+
 } vlib_thread_main_t;
 
 extern vlib_thread_main_t vlib_thread_main;
@@ -391,10 +388,15 @@ vlib_worker_thread_barrier_check (void)
 {
   if (PREDICT_FALSE (*vlib_worker_threads->wait_at_barrier))
     {
+      vlib_global_main_t *vgm = vlib_get_global_main ();
       vlib_main_t *vm = vlib_get_main ();
       u32 thread_index = vm->thread_index;
       f64 t = vlib_time_now (vm);
 
+      if (PREDICT_FALSE (vec_len (vm->barrier_perf_callbacks) != 0))
+       clib_call_callbacks (vm->barrier_perf_callbacks, vm,
+                            vm->clib_time.last_cpu_time, 0 /* enter */ );
+
       if (PREDICT_FALSE (vlib_worker_threads->barrier_elog_enabled))
        {
          vlib_worker_thread_t *w = vlib_worker_threads + thread_index;
@@ -410,17 +412,16 @@ vlib_worker_thread_barrier_check (void)
            u32 thread_index;
          } __clib_packed *ed;
 
-         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
-                               w->elog_track);
+         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
          ed->thread_index = thread_index;
        }
 
-      clib_atomic_fetch_add (vlib_worker_threads->workers_at_barrier, 1);
       if (CLIB_DEBUG > 0)
        {
          vm = vlib_get_main ();
          vm->parked_at_barrier = 1;
        }
+      clib_atomic_fetch_add (vlib_worker_threads->workers_at_barrier, 1);
       while (*vlib_worker_threads->wait_at_barrier)
        ;
 
@@ -434,7 +435,7 @@ vlib_worker_thread_barrier_check (void)
        f64 now;
        vm->time_offset = 0.0;
        now = vlib_time_now (vm);
-       vm->time_offset = vlib_global_main.time_last_barrier_release - now;
+       vm->time_offset = vgm->vlib_mains[0]->time_last_barrier_release - now;
        vm->time_last_barrier_release = vlib_time_now (vm);
       }
 
@@ -488,11 +489,14 @@ vlib_worker_thread_barrier_check (void)
            u32 duration;
          } __clib_packed *ed;
 
-         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
-                               w->elog_track);
+         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
          ed->thread_index = thread_index;
          ed->duration = (int) (1000000.0 * t);
        }
+
+      if (PREDICT_FALSE (vec_len (vm->barrier_perf_callbacks) != 0))
+       clib_call_callbacks (vm->barrier_perf_callbacks, vm,
+                            vm->clib_time.last_cpu_time, 1 /* leave */ );
     }
 }
 
@@ -502,7 +506,7 @@ vlib_get_worker_vlib_main (u32 worker_index)
   vlib_main_t *vm;
   vlib_thread_main_t *tm = &vlib_thread_main;
   ASSERT (worker_index < tm->n_vlib_mains - 1);
-  vm = vlib_mains[worker_index + 1];
+  vm = vlib_get_main_by_index (worker_index + 1);
   ASSERT (vm);
   return vm;
 }
@@ -612,8 +616,9 @@ void
 vlib_process_signal_event_mt_helper (vlib_process_signal_event_mt_args_t *
                                     args);
 void vlib_rpc_call_main_thread (void *function, u8 * args, u32 size);
+void vlib_get_thread_core_numa (vlib_worker_thread_t * w, unsigned cpu_id);
+vlib_thread_main_t *vlib_get_thread_main_not_inline (void);
 
-u32 elog_global_id_for_msg_name (const char *msg_name);
 #endif /* included_vlib_threads_h */
 
 /*