From 848191d3e1b1b2febb1f67e5121487f871e67b56 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Thu, 28 Apr 2016 16:24:15 -0400 Subject: Clean up per-thread mheap setup. The stats thread was sharing the main mheap when we started at least one worker or I/O thread, but ran on its own mheap when we started 0 worker + io threads. Net of this change; if a VLIB_REGISTER_THREAD instance specifies a per-thread mheap, a per-thread mheap will be provided. Otherwise, threads share the main heap. The stats thread now uses the main heap. Simpler is better. Change-Id: I1fff0dd66ae8f7dfe44923f702734e2832b55b09 Signed-off-by: Dave Barach --- vlib/vlib/threads.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'vlib') diff --git a/vlib/vlib/threads.c b/vlib/vlib/threads.c index 32ebdfe7..3b815be4 100644 --- a/vlib/vlib/threads.c +++ b/vlib/vlib/threads.c @@ -535,7 +535,9 @@ static clib_error_t * start_workers (vlib_main_t * vm) vlib_node_runtime_t * rt; u32 n_vlib_mains = tm->n_vlib_mains; u32 worker_thread_index; - + u8 * main_heap = clib_mem_get_per_cpu_heap(); + mheap_t * main_heap_header = mheap_header (main_heap); + vec_reset_length (vlib_worker_threads); /* Set up the main thread */ @@ -558,21 +560,19 @@ static clib_error_t * start_workers (vlib_main_t * vm) } #endif + /* + * Truth of the matter: we always use at least two + * threads. So, make the main heap thread-safe + * and make the event log thread-safe. + */ + main_heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; + vm->elog_main.lock = + clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, + CLIB_CACHE_LINE_BYTES); + vm->elog_main.lock[0] = 0; + if (n_vlib_mains > 1) { - u8 * heap = clib_mem_get_per_cpu_heap(); - mheap_t * h = mheap_header (heap); - - /* make the main heap thread-safe */ - h->flags |= MHEAP_FLAG_THREAD_SAFE; - - /* Make the event-log MP-safe */ - vm->elog_main.lock = - clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, - CLIB_CACHE_LINE_BYTES); - - vm->elog_main.lock[0] = 0; - vec_validate (vlib_mains, tm->n_vlib_mains - 1); _vec_len (vlib_mains) = 0; vec_add1 (vlib_mains, vm); @@ -609,13 +609,10 @@ static clib_error_t * start_workers (vlib_main_t * vm) for (k = 0; k < tr->count; k++) { vec_add2 (vlib_worker_threads, w, 1); - /* - * Share the main heap which is now thread-safe. - * - * To allocate separate heaps, code: - * mheap_alloc (0 / * use VM * /, tr->mheap_size); - */ - w->thread_mheap = heap; + if (tr->mheap_size) + w->thread_mheap = mheap_alloc (0 /* use VM */, tr->mheap_size); + else + w->thread_mheap = main_heap; w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; w->thread_function = tr->function; w->thread_function_arg = w; @@ -744,7 +741,10 @@ static clib_error_t * start_workers (vlib_main_t * vm) for (j = 0; j < tr->count; j++) { vec_add2 (vlib_worker_threads, w, 1); - w->thread_mheap = mheap_alloc (0 /* use VM */, tr->mheap_size); + if (tr->mheap_size) + w->thread_mheap = mheap_alloc (0 /* use VM */, tr->mheap_size); + else + w->thread_mheap = main_heap; w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; w->thread_function = tr->function; w->thread_function_arg = w; -- cgit 1.2.3-korg