diff options
author | Vladimir Isaev <visaev@netgate.com> | 2020-03-17 12:56:31 +0300 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2020-03-21 12:10:52 +0000 |
commit | 2ed4204c91bf0c79639f39dc01601d58a0e536ee (patch) | |
tree | 2ea4119888532f312715242c7c0a6ca670c32d14 /src | |
parent | 18a4a371646bccfd299e6a509e801a524aeb4c92 (diff) |
vlib: allow using core 0 as a last resort
Right now even following configuration fails:
cpu {
corelist-workers 0
}
I think we should allow user to use CPU 0 if he explicitly
configured it or as the last automatically assigned core.
Type: improvement
Signed-off-by: Vladimir Isaev <visaev@netgate.com>
Change-Id: I041c30349bace558c673475e9a0cffccae5821f7
Diffstat (limited to 'src')
-rw-r--r-- | src/vlib/threads.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c index a7d9155cb58..a6915c5949b 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -256,21 +256,6 @@ vlib_thread_init (vlib_main_t * vm) } avail_cpu = clib_bitmap_set (avail_cpu, tm->main_lcore, 0); - /* - * Determine if the number of workers is greater than 0. - * If so, mark CPU 0 unavailable so workers will be numbered after main. - */ - u32 n_workers = 0; - uword *p = hash_get_mem (tm->thread_registrations_by_name, "workers"); - if (p != 0) - { - vlib_thread_registration_t *tr = (vlib_thread_registration_t *) p[0]; - int worker_thread_count = tr->count; - n_workers = worker_thread_count; - } - if (tm->skip_cores == 0 && n_workers) - avail_cpu = clib_bitmap_set (avail_cpu, 0, 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); @@ -352,12 +337,24 @@ vlib_thread_init (vlib_main_t * vm) { for (j = 0; j < tr->count; j++) { + /* Do not use CPU 0 by default - leave it to the host and IRQs */ + uword avail_c0 = clib_bitmap_get (avail_cpu, 0); + avail_cpu = clib_bitmap_set (avail_cpu, 0, 0); + uword c = clib_bitmap_first_set (avail_cpu); + /* Use CPU 0 as a last resort */ + if (c == ~0 && avail_c0) + { + c = 0; + avail_c0 = 0; + } + if (c == ~0) return clib_error_return (0, "no available cpus to be used for" " the '%s' thread", tr->name); + avail_cpu = clib_bitmap_set (avail_cpu, 0, avail_c0); avail_cpu = clib_bitmap_set (avail_cpu, c, 0); tr->coremask = clib_bitmap_set (tr->coremask, c, 1); } |