aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlib/threads.c
diff options
context:
space:
mode:
authorVladimir Isaev <visaev@netgate.com>2020-03-17 12:56:31 +0300
committerDamjan Marion <dmarion@me.com>2020-03-21 12:10:52 +0000
commit2ed4204c91bf0c79639f39dc01601d58a0e536ee (patch)
tree2ea4119888532f312715242c7c0a6ca670c32d14 /src/vlib/threads.c
parent18a4a371646bccfd299e6a509e801a524aeb4c92 (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/vlib/threads.c')
-rw-r--r--src/vlib/threads.c27
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);
}