aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlib
diff options
context:
space:
mode:
authorJon Loeliger <jdl@netgate.com>2020-01-31 13:34:56 -0600
committerAndrew Yourtchenko <ayourtch@gmail.com>2020-08-12 15:59:46 +0000
commit954c0bb0cf5735e2506d5bbaa967d81902f56007 (patch)
tree2c1e9daa69a902a9ff90030a4515269b75880379 /src/vlib
parentfe7690230ac03991e3e7aa863164f923e5619218 (diff)
vlib: Skip core 0 if workers are configured.
According to the description in the startup.conf, the assignment of worker threads starts with the lcore following the main_lcore. A non-zero skip_cores will correctly achieve this assignment. However, prior to this patch when workers are assigned, the code picks up and assigns core 0 even thought it shouldn't. This patch determins if a non-zero number of workers are desired and if so, marks CPU unavailable for a worker assignment. Type: fix Change-Id: I1fdf73a6f218dcbf146fda2efc90c553f7cd6d20 Signed-off-by: Jon Loeliger <jdl@netgate.com> (cherry picked from commit 4a06846dd668d7f687e6770215c38e8feb5f1740)
Diffstat (limited to 'src/vlib')
-rw-r--r--src/vlib/threads.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c
index 26b9e7f8d56..e1a9e8cbae5 100644
--- a/src/vlib/threads.c
+++ b/src/vlib/threads.c
@@ -255,6 +255,21 @@ 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);