diff options
Diffstat (limited to 'src/vlib')
-rw-r--r-- | src/vlib/threads.c | 33 | ||||
-rw-r--r-- | src/vlib/threads_cli.c | 3 |
2 files changed, 17 insertions, 19 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 36a80800a09..57ba39a00d8 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -175,7 +175,6 @@ vlib_thread_init (vlib_main_t * vm) vlib_thread_main_t *tm = &vlib_thread_main; vlib_worker_thread_t *w; vlib_thread_registration_t *tr; - cpu_set_t cpuset; u32 n_vlib_mains = 1; u32 first_index = 1; u32 i; @@ -205,33 +204,26 @@ vlib_thread_init (vlib_main_t * vm) } /* grab cpu for main thread */ - if (tm->main_lcore == ~0) - { - /* if main-lcore is not set, we try to use lcore 1 */ - if (clib_bitmap_get (avail_cpu, 1)) - tm->main_lcore = 1; - else - tm->main_lcore = clib_bitmap_first_set (avail_cpu); - if (tm->main_lcore == (u8) ~ 0) - return clib_error_return (0, "no available cpus to be used for the" - " main thread"); - } - else + if (tm->main_lcore != ~0) { if (clib_bitmap_get (avail_cpu, tm->main_lcore) == 0) return clib_error_return (0, "cpu %u is not available to be used" " for the main thread", tm->main_lcore); + avail_cpu = clib_bitmap_set (avail_cpu, tm->main_lcore, 0); } - avail_cpu = clib_bitmap_set (avail_cpu, tm->main_lcore, 0); /* assume that there is socket 0 only if there is no data from sysfs */ if (!tm->cpu_socket_bitmap) tm->cpu_socket_bitmap = clib_bitmap_set (0, 0, 1); /* pin main thread to main_lcore */ - CPU_ZERO (&cpuset); - CPU_SET (tm->main_lcore, &cpuset); - pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset); + if (tm->main_lcore != ~0) + { + cpu_set_t cpuset; + CPU_ZERO (&cpuset); + CPU_SET (tm->main_lcore, &cpuset); + pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset); + } /* Set up thread 0 */ vec_validate_aligned (vlib_worker_threads, 0, CLIB_CACHE_LINE_BYTES); @@ -1652,12 +1644,17 @@ vlib_rpc_call_main_thread (void *callback, u8 * args, u32 arg_size) clib_error_t * threads_init (vlib_main_t * vm) { + const vlib_thread_main_t *tm = vlib_get_thread_main (); + + if (tm->main_lcore == ~0 && tm->n_vlib_mains > 1) + return clib_error_return (0, "Configuration error, a main core must " + "be specified when using worker threads"); + return 0; } VLIB_INIT_FUNCTION (threads_init); - static clib_error_t * show_clock_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) diff --git a/src/vlib/threads_cli.c b/src/vlib/threads_cli.c index d14e9c50e27..9b304664283 100644 --- a/src/vlib/threads_cli.c +++ b/src/vlib/threads_cli.c @@ -43,6 +43,7 @@ static clib_error_t * show_threads_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { + const vlib_thread_main_t *tm = vlib_get_thread_main (); vlib_worker_thread_t *w; int i; @@ -64,7 +65,7 @@ show_threads_fn (vlib_main_t * vm, line = format (line, "%-25U", format_sched_policy_and_priority, w->lwp); int cpu_id = w->cpu_id; - if (cpu_id > -1) + if (cpu_id > -1 && tm->main_lcore != ~0) { int core_id = w->core_id; int numa_id = w->numa_id; |