vlib: allow using core 0 as a last resort 45/25945/2
authorVladimir Isaev <visaev@netgate.com>
Tue, 17 Mar 2020 09:56:31 +0000 (12:56 +0300)
committerDamjan Marion <dmarion@me.com>
Sat, 21 Mar 2020 12:10:52 +0000 (12:10 +0000)
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

src/vlib/threads.c

index a7d9155..a6915c5 100644 (file)
@@ -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);
            }