summaryrefslogtreecommitdiffstats
path: root/src/vlib/threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vlib/threads.c')
-rw-r--r--src/vlib/threads.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c
index cf82e1802d6..278838798a9 100644
--- a/src/vlib/threads.c
+++ b/src/vlib/threads.c
@@ -670,6 +670,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;
@@ -694,19 +695,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 +726,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;
@@ -780,14 +779,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 +797,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 +897,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++;
}
@@ -1386,9 +1386,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 +1558,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 +1583,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 +1594,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 +1671,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 +1686,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 +1720,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 +1843,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 +1857,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);