}
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);
{
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);
}
vlib_frame_queue_main_t *fqm;
vlib_frame_queue_t *fq;
int i;
+ u32 num_threads;
if (frame_queue_nelts == 0)
frame_queue_nelts = FRAME_QUEUE_MAX_NELTS;
- ASSERT (frame_queue_nelts >= 8);
+ num_threads = 1 /* main thread */ + tm->n_threads;
+ ASSERT (frame_queue_nelts >= 8 + num_threads);
vec_add2 (tm->frame_queue_mains, fqm, 1);
fqm->node_index = node_index;
fqm->frame_queue_nelts = frame_queue_nelts;
- fqm->queue_hi_thresh = frame_queue_nelts - 2;
+ fqm->queue_hi_thresh = frame_queue_nelts - num_threads;
vec_validate (fqm->vlib_frame_queues, tm->n_vlib_mains - 1);
vec_validate (fqm->per_thread_data, tm->n_vlib_mains - 1);