X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fthreads.h;h=6894cdf83793c4140c0c6eb28c54c8326902ed17;hb=8c609af230c157304c3ddb09bfcd6d8098c6ea92;hp=fc34074127fe3a4b5976e6b5169529e1d6cef5f4;hpb=c602b384ac022f70690a3a7c711149f7cb63ad12;p=vpp.git diff --git a/src/vlib/threads.h b/src/vlib/threads.h index fc34074127f..6894cdf8379 100644 --- a/src/vlib/threads.h +++ b/src/vlib/threads.h @@ -16,6 +16,7 @@ #define included_vlib_threads_h #include +#include #include extern vlib_main_t **vlib_mains; @@ -110,7 +111,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,8 +207,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) @@ -338,6 +344,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; @@ -396,6 +406,10 @@ vlib_worker_thread_barrier_check (void) 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; @@ -416,12 +430,12 @@ vlib_worker_thread_barrier_check (void) 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) ; @@ -494,6 +508,10 @@ vlib_worker_thread_barrier_check (void) 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 */ ); } } @@ -613,8 +631,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 */ /*